Phantom Read란? 트랜잭션 격리 수준에서 생기는 이상 현상

Phantom Read란 무엇인가 Phantom Read(팬텀 리드)는 데이터베이스 트랜잭션 격리 수준에서 발생할 수 있는 이상 현상 중 하나로, 하나의 트랜잭션 내에서 동일한 조건으로 두 번 조회했을 때 조회 결과의 ‘행 개수’가 달라지는 현상을 말한다. 이름 그대로 마치 유령처럼 없던 데이터가 나타나거나, 있던 데이터가 사라지는 것처럼 보인다고 해서 붙여진 이름이다. 흔히 헷갈리는 Non-Repeatable Read와 비교하면 이해가 쉽다. … 더 읽기

Write Skew란? 트랜잭션에서 발생하는 숨은 함정

Write Skew란 무엇인가 Write Skew는 두 개 이상의 트랜잭션이 서로 다른 데이터를 각각 읽고 수정하지만, 그 데이터들이 논리적으로 연결되어 있어서 결과적으로 비즈니스 규칙이 깨지는 동시성 이상 현상입니다. 각 트랜잭션이 자신이 쓴 로우만 보면 문제가 없어 보이지만, 두 트랜잭션의 결과를 합치면 애초에 허용되지 않아야 할 상태가 되어버립니다. 이는 Dirty Read나 Lost Update처럼 같은 로우를 두 트랜잭션이 … 더 읽기

Snapshot Isolation이란? DB 트랜잭션 격리의 실전 기법

Snapshot Isolation이란? Snapshot Isolation(스냅샷 격리)은 트랜잭션이 시작되는 시점의 데이터베이스 상태를 하나의 ‘스냅샷’처럼 고정해두고, 그 스냅샷을 기준으로 모든 읽기 작업을 수행하는 격리 수준입니다. 트랜잭션이 진행되는 동안 다른 트랜잭션이 데이터를 변경해도, 내가 보는 데이터는 처음 시작할 때 찍어둔 사진처럼 변하지 않습니다. 그래서 이름 그대로 ‘스냅샷’이라는 표현을 씁니다. 도서관에서 책을 대출하기 전에 서가 상태를 사진으로 찍어두고, 그 사진만 … 더 읽기

MVCC란? 락 없이 동시성을 처리하는 방법

MVCC의 정의 MVCC(Multi-Version Concurrency Control)는 ‘다중 버전 동시성 제어’라는 뜻으로, 데이터베이스가 하나의 데이터에 대해 여러 버전을 동시에 유지하면서 동시성을 처리하는 기법입니다. PostgreSQL, MySQL의 InnoDB, Oracle 등 대부분의 상용 DBMS가 이 방식을 채택하고 있습니다. 전통적인 락(lock) 기반 동시성 제어는 한 트랜잭션이 데이터를 읽거나 쓸 때 다른 트랜잭션이 접근하지 못하도록 잠그는 방식입니다. 하지만 이 방식은 읽기 작업조차 … 더 읽기

Read Repair란? 분산 시스템에서 데이터 일관성 복구하기

Read Repair의 정의 분산 데이터베이스는 하나의 데이터를 여러 노드에 복제해서 저장한다. 그런데 네트워크 지연이나 일시적인 장애로 인해 특정 노드에만 데이터 반영이 늦어지면, 노드 간 데이터가 서로 다른 상태가 될 수 있다. 이를 ‘복제본 불일치’라고 부른다. Read Repair는 클라이언트가 데이터를 읽는 시점에 이 불일치를 감지하고 자동으로 최신 값으로 맞춰주는 복구 메커니즘이다. 즉, 읽기(Read) 작업이 발생할 때마다 … 더 읽기

리키 버킷 알고리즘이란? 트래픽을 일정하게 흘려보내는 방법

리키 버킷 알고리즘의 정의 리키 버킷(Leaky Bucket) 알고리즘은 네트워크나 API 트래픽을 일정한 속도로 제어하기 위한 대표적인 트래픽 셰이핑(Traffic Shaping) 기법입니다. 이름 그대로 ‘물이 새는 양동이’를 떠올리면 이해하기 쉽습니다. 양동이에 물을 아무리 빠르게 부어도, 바닥에 뚫린 작은 구멍으로는 항상 일정한 속도로만 물이 빠져나갑니다. 여기서 물은 요청(Request)이고, 양동이는 요청을 담아두는 큐(Queue), 구멍으로 빠지는 속도는 서버가 실제로 처리하는 … 더 읽기

슬라이딩 윈도우 알고리즘으로 API 요청 제한하기

슬라이딩 윈도우란 무엇인가 API 요청 제한(Rate Limiting)은 한 사용자가 정해진 시간 안에 너무 많은 요청을 보내지 못하도록 막는 기법입니다. 이를 구현하는 대표적인 방법 중 하나가 ‘슬라이딩 윈도우(Sliding Window)’ 알고리즘입니다. 이름 그대로 시간이라는 창(윈도우)을 고정하지 않고, 현재 시각을 기준으로 계속 움직이면서 그 범위 안의 요청 수를 세는 방식입니다. 비유하자면 은행 창구에서 ‘최근 1분 동안 몇 명이 … 더 읽기

Bounded Context란? DDD에서 도메인 경계를 나누는 이유

Bounded Context의 정의 도메인 주도 설계(DDD)에서 Bounded Context(경계 컨텍스트)는 특정 도메인 모델이 유효하게 적용되는 범위를 뜻합니다. 하나의 시스템 안에는 여러 도메인 개념이 존재하는데, 같은 용어라도 부서나 업무 맥락에 따라 의미가 달라질 수 있습니다. Bounded Context는 이런 모호함을 없애기 위해 ‘이 용어는 이 범위 안에서만 이런 의미를 가진다’라고 명확히 선을 긋는 역할을 합니다. 같은 단어, 다른 … 더 읽기

Hexagonal Architecture란? 포트와 어댑터로 의존성을 분리하는 이유

Hexagonal Architecture의 정의 Hexagonal Architecture는 앨리스터 코오번(Alistair Cockburn)이 제안한 소프트웨어 설계 패턴으로, ‘포트와 어댑터(Ports and Adapters)’ 패턴이라고도 불립니다. 핵심 아이디어는 애플리케이션의 핵심 로직(도메인, 비즈니스 규칙)을 외부 기술 요소인 DB, 웹 프레임워크, 메시지 큐 등으로부터 완전히 분리하는 것입니다. 육각형 모양은 실제 의미보다는 상징적인 표현으로, 중심에 비즈니스 로직을 두고 여러 방향에서 외부 시스템이 연결될 수 있음을 시각화한 … 더 읽기

Poison Message란? 메시지 큐를 멈추게 하는 불량 메시지 처리법

Poison Message의 정의 Poison Message(포이즌 메시지)란 메시지 큐 시스템에서 정상적으로 처리되지 못하고 계속 실패하는 메시지를 의미합니다. 소비자(Consumer)가 메시지를 처리하려고 할 때마다 예외가 발생하고, 큐 시스템은 실패한 메시지를 다시 큐에 돌려놓는 재시도(Retry) 로직을 갖고 있는 경우가 많습니다. 문제는 이 메시지 자체에 결함이 있어서 아무리 재시도해도 절대 성공하지 못한다는 점입니다. 마치 독약이 든 음식처럼, 한 번 시스템에 … 더 읽기