RECENT POSTS

최근에 작성한 글

01 / 03

전체 글

전체 보기

[CS] 데이터베이스 정규화와 Heap

1. 데이터베이스 정규화1. 정규화란?데이터의 중복을 최소화하고, 데이터의 삽입, 수정, 삭제 과정에서 발생할 수 있는 이상 현상을 방지하기 위해 테이블을 구조적으로 분해하는 과정. 하나의 테이블에 여러 종류의 정보가 함께 저장되면 동일한 데이터가 여러 행에 반복될 수 있다.예를 들어 다음과 같은 테이블이 있다고 해보자.주문 ID회원 ID회원 이름상품 ID상품명110은콩100키보드210 은콩200마우스320티모100키보드 회원 이름이나 상품명이 여러 행에서 반복된다. 이러한 중복은 다음과 같은 이상 현상을 발생시킬 수 있다.삽입 이상(Insertion Anomaly) : 불필요한 데이터가 없으면 원하는 데이터를 추가할 수 없는 문제갱신 이상(Update Anomaly) : 중복된 데이터 중 일부만 수정되..

[CS] RabbitMQ vs Kafka

RabbitMQ vs KafkaMSA 환경에서는 서비스 간 결합도를 낮추고 비동기 통신을 구현하기 위해 메시지 브로커를 사용할 수 있다. 대표적인 기술로 RabbitMQ와 Apache Kafka가 있다. 두 기술 모두 Producer가 메시지를 발행하고 Consumer가 이를 비동기로 처리하도록 만들 수 있기 때문에 비슷해 보이지 만, 출발점과 핵심 설계 철학이 다르다.간단하게 정리하면 다음과 같다.RabbitMQ는 메시지를 전달하고 처리하는 Message Broker에서 출발했고, Kafka는 이벤트를 저장하고 다시 읽을 수 있는 Distributed Log에서 출발했다. 최근에는 RabbitMQ에 Stream이 추가되고 Kafka에도 Queue Semantic이 추가되면서 기능적으로 겹치는 부분이 많..

[동시성] 동시 요청에서 ACTIVE 데이터는 어떻게 하나만 보장할까?

AI 위험 분석에 사용할 프롬프트를 DB에서 버전별로 관리하는 기능을 구현했다.프롬프트를 새로 등록하면 기존 ACTIVE 프롬프트를 RETIRED 상태로 변경하고, 새로운 버전을 ACTIVE 상태로 저장하는 방식이다. 예를 들어 v1이 활성화된 상태에서 새로운 프롬프트를 등록하면 다음과 같이 변경된다.등록 전v1 ACTIVE등록 후v1 RETIREDv2 ACTIVE 이 구조에서 지켜야 할 중요한 조건이 하나 있었다.동일한 prompt_key에는 ACTIVE 상태의 프롬프트가 항상 하나만 존재해야 한다.단일 요청에서는 문제가 없었지만, 동일한 프롬프트에 대한 등록 요청이 동시에 들어오면 이 조건이 깨질 가능성이 있었다.1. 동시 요청에서 Race Condition 재현하기기존 프롬프트 등록 로직은 크게 다..

[CS] CPU 스케줄링과 TCP/UDP 차이

1. CPU 스케줄링1. CPU 스케줄링이란?CPU 스케줄링은 여러 프로세스가 CPU를 사용하려고 할 때 어떤 프로세스에게 CPU를 할당할지 운영체제가 결정하는 과정이다. 하나의 CPU 코어는 한 순간에 하나의 작업을 실행할 수 있다. 따라서 여러 프로세스가 동시에 실행 가능한 상태라면 운영체제는 CPU를 효율적으로 사용하기 위해 어떤 프로세스를 먼저 실행할지 결정해야한다.멀티코어 환경에서는 여러 프로세스가 실제로 동시에 실행될 수 있지만 각 CPU 코어에 어떤 작업을 할당할지는 여전히 스케줄링이 필요하다.2. CPU 스케줄링이 필요한 이유CPU를 사용하려는 프로세스는 여러 개일 수 있지만 CPU라는 자원은 한정되어 있다.만약 하나의 프로세스가 CPU를 오랫동안 독점한다면 다른 프로세스는 실행되지 못하고..

[CS] GC와 Spring MVC 요청 처리 과정

1. Java Garbage Collection1. Garbage Collection이란?Java에서 객체는 주로 Heap 영역에 생성된다.User user = new User(); new User()로 생성된 객체는 Heap 영역에 저장되고 변수 user는 해당 객체를 참조한다.프로그램이 실행되다 보면 더 이상 사용하지 않는 객체가 발생한다.User user = new User();user = null; 기존에 생성된 User 객체를 참조하는 곳이 없다면 해당 객체는 더 이상 사용할 수 없는 객체가 된다. Garbage Collection(GC) 은 이처럼 더 이상 참조되지 않아 사용할 수 없는 객체를 찾아 Heap 메모리에서 제거하여 메모리를 자동으로 관리하는 기능. 자바에서는 GC가 작업을 수행하기..

[Review] AI 분석을 비동기로 처리하기 : Spring Event부터 다중 인스턴스까지

이번 프로젝트에서는 사용자가 생성한 투자 전략과 백테스트 결과를 LLM에 전달하고, 위험 등급과 위험 요인을 분석하는 기능을 구현했다. AI 분석은 일반적인 DB 조회와 달리 LLM API 호출 시간이 필요하다. 따라서 사용자가 분석을 요청할 때 LLM 응답이 끝날 때까지 HTTP 요청을 유지하는 대신, 분석 요청과 실제 AI 처리를 분리하는 비동기 구조를 적용했다.1. 처음 설계한 AI 분석 흐름AI 분석 요청이 들어오면 먼저 PostgreSQL에 분석 데이터를 PENDING 상태로 저장한다.POST /api/v1/ai/analyses │ ▼전략 / 백테스트 검증 │ ▼AiRiskAnalysis 저장status = PENDING │ ..

[CS] DB JOIN과 이진 탐색

1. INNER JOIN과 LEFT OUTER JOIN1. JOIN이란?관계형 데이터베이스에서 두 개 이상의 테이블을 특정 칼럼을 기준으로 연결하여 데이터를 조회하는 방법.예를 들어 회원 정보를 저장하는 users 테이블과 주문 정보를 저장하는 orders 테이블이 있다고 가정하자.usersidname1은콩이2모리3티모ordersiduser_idproduct1011키보드1021마우스1032모니터 orders.user_id는 주문을 생성한 사용자의 users.id를 참조한다고 가정한다.2. INNER JOIN두 테이블에서 JOIN 조건을 만족하는 데이터만 조회한다.SELECT u.id, u.name, o.product FROM users u INNER JOIN orders o ON u.id = o...

[Plus] Let’s Encrypt 인증서를 적용하면 HTTPS는 어떻게 동작할까?

1. HTTPS를 적용하며 생긴 궁금증프로젝트에서 프론트엔드는 Vercel에 배포하고, Spring Boot 백엔드는 AWS EC2에 배포했다. AWS 서버에는 Nginx를 설치하고 Let’s Encrypt에서 인증서를 발급받아 HTTPS를 적용했다. HTTPS의 동작 과정을 공부하다 보니 다음과 같은 궁금증이 생겼다.TLS Handshake 과정에서 클라이언트가 지원하는 TLS 버전과 암호화 알고리즘을 서버에 전달한다는데, 프론트엔드에서는 이런 정보를 설정한 적이 없다. 그렇다면 클라이언트는 이를 어떻게 알고 전달하는 것일까?결론부터 말하면 프론트엔드 코드가 TLS 버전과 암호화 알고리즘을 직접 설정하는 것이 아니다.https:// 주소로 요청하면 브라우저와 Nginx가 애플리케이션 코드 아래의 네트워..