노트

CDC (변경 데이터 캡처)

Change Data Capture

백엔드#db#architecture · 연결된 개념 8개

쉽게 말하면

CDC는 가계부를 손으로 따로 적는 대신 은행 통장 거래 내역을 읽어 자동으로 옮겨 적는 방식이에요. 은행이 이미 남긴 기록을 쓰니, 깜빡하고 안 적어서 두 장부가 어긋날 일이 거의 없죠.

비유가 깨지는 곳 통장 내역엔 '어느 칸이 얼마로 바뀌었다'만 있어서 받는 쪽이 테이블 구조에 묶여요. 같은 변경이 두 번 올 수 있어 소비자는 멱등해야 하고, 반영은 조금 늦는 최종 일관성이에요.

CDC(Change Data Capture)는 데이터베이스의 변경 로그를 읽어 "어떤 행이 어떻게 바뀌었다"는 이벤트로 바꿔 내보내는 기법이다. 애플리케이션 코드가 아니라 DB가 이미 남기는 기록에서 변경을 뽑아내므로, 다른 저장소와 동기화할 때 누락 위험이 가장 낮다.

PostgreSQL ──WAL──▶ Debezium ──이벤트──▶ Kafka ──▶ 검색 색인, 알림, 정산 …
(원본 변경)       (변경 감지)          (보관·분배)
  • WAL·binlog: PostgreSQL의 Write-Ahead Log, MySQL의 binlog처럼 DB가 모든 변경을 먼저 적는 로그
  • Debezium: 이 로그를 읽어 변경 이벤트로 바꾸는 대표 커넥터. 보통 Kafka로 내보낸다

왜 이중 쓰기보다 나은가

앱이 DB에 저장하고 이어서 검색 엔진도 직접 갱신하면(이중 쓰기, dual write), 두 번째 호출이 실패할 때 영구적인 불일치가 남는다. CDC는 DB에 커밋된 변경만 읽으므로 "커밋됐는데 이벤트가 안 나감" 틈이 거의 없다. 앱은 검색 엔진의 존재를 몰라도 된다.

대가

  • Debezium·Kafka 같은 인프라가 무겁고 운영 난이도가 높다
  • 테이블 구조가 그대로 이벤트에 드러나 소비자가 스키마에 묶인다. 도메인 이벤트를 직접 설계하고 싶다면 트랜잭셔널 아웃박스 패턴가 낫다
  • 전달은 at-least-once(최소 한 번 전달)라 소비자는 멱등해야 하고, 결과는 최종 일관성이다

DB 내부에서 변경을 복제하는 데이터베이스 다중화과 같은 로그를 쓰지만, 목적지가 다른 종류의 시스템이라는 점이 다르다. 검색 색인 동기화 맥락은 역색인과 검색 엔진를 본다.

출처: Debezium Features · Debezium Architecture

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • DB 인덱스와 트레이드오프

    DB 인덱스는 특정 컬럼 값으로 행을 빨리 찾도록 테이블 옆에 따로 유지하는 보조 자료구조(auxiliary data structure)다. 관계형 DB의 기본 인덱스는 정렬된 균형 트리(B-tree 계열)라서, 전체를 훑지 않고 트리를 따라 내려가 원하는 행에 닿는다.

  • 결합도

    한 요소를 바꿀 때 다른 요소도 바꿔야 하는 관계. 결합도는 언제나 "어떤 변경에 대해" 결합되어 있는지를 함께 말해야 의미가 있다. 같은 두 모듈도 어떤 변경에는 묶여 있고 어떤 변경에는 독립적일 수 있다.

  • 데이터 무결성

    데이터 무결성(data integrity)은 저장된 데이터가 정확하고 일관되며 믿을 수 있는 상태로 유지되는 것이다. 재고가 100개로 보이는데 실제로 50개라면 무결성이 깨진 것이다. 관계형 DB는 이를 제약 조건(constraint)으로 강제한다.

  • ACID

    ACID는 DB 트랜잭션이 보장해야 할 네 가지 성질이다. 트랜잭션은 "계좌 이체의 출금 + 입금"처럼 함께 성공하거나 함께 실패해야 하는 논리적 작업 단위다.

  • 로컬 퍼스트 아키텍처

    클라이언트 기기의 로컬 데이터를 진실의 원천(Source of Truth)으로 삼고, 서버는 동기화와 백업을 맡는 설계 방식. 전통적인 "서버가 원천, 클라이언트는 요청해서 그린다" 구조를 뒤집어 로컬 DB → UI 렌더링 → 백그라운드 동기화 순서로 흐른다.

보기 옵션