490. CDC (변경 데이터 캡처) 스트림 추출

⚠️ 이 문서는 매일 밤 12시에 1억 건의 데이터를 통째로 복사해 가는 구식 배치(Batch) 작업의 한계를 부수고, **데이터베이스에서 무언가 수정(UPDATE)되는 그 '찰나의 순간'을 낚아채서 0.1초 만에 다른 시스템으로 실시간 배달해 주는 마법의 파이프라인인 'CDC'**를 다룹니다.

핵심 인사이트 (3줄 요약)

  1. 본질: Change Data Capture. 데이터베이스에 발생하는 INSERT, UPDATE, DELETE 이벤트(변경 사항)를 실시간으로 추적하고 캡처하여 다른 시스템(DW, 검색 엔진 등)으로 흘려보내는 기술이다.
  2. 작동 원리 (Log-based): 진짜 데이터 테이블을 SELECT로 무식하게 긁어오는 게 아니라, 데이터베이스가 복구를 위해 몰래 적어두는 '트랜잭션 로그(Redo Log, Binlog)'를 빨대 꽂고 훔쳐보는 방식을 쓴다. (DB 성능 저하 0%)
  3. 가치: "어제 매출 통계"가 아니라 "지금 이 순간의 실시간 매출 대시보드"를 만들 수 있게 해주며, MSA 환경에서 서로 다른 서비스 간의 데이터 동기화를 완벽하게 해결해 준다.

Ⅰ. 개요: 12시의 종이 울리면 (Context & Necessity)

"검색용 DB(ElasticSearch)에 방금 가입한 유저 정보 좀 동기화해 줘!"

  • 과거의 방식 (Batch & Polling):
    • 매일 밤 12시마다 SELECT * FROM Users WHERE 가입일 = 오늘 쿼리를 날려서 10만 건을 통째로 퍼간다.
    • 문제점: 낮 12시에 가입한 유저는 밤 12시까지 12시간 동안 검색이 안 된다. 실시간(Real-time)이 아니며, 밤 12시만 되면 DB 서버가 퍼나르는 쿼리 때문에 죽어 나간다.

**CDC(변경 데이터 캡처)**는 이 폴링(Polling) 방식의 미개함을 끝냈다. 사용자가 회원 가입 버튼을 누르고 MySQL에 INSERT가 찍히는 순간, CDC 도구가 그 이벤트를 0.1초 만에 낚아채서(Capture) 검색 DB로 INSERT 하라고 휙 던져준다(Stream).

📢 섹션 요약 비유: 과거 방식이 우체부 아저씨가 하루에 딱 한 번 우체통을 통째로 비워가는 **'우편 배달'**이라면, CDC는 누군가 카톡방에 글을 쓰자마자 모든 사람의 핸드폰에 "띵동!" 하고 알림이 울리는 **'실시간 푸시 알림(Messenger)'**과 같습니다.


Ⅱ. CDC의 궁극의 무기: 로그 기반 (Log-based) 추출 ★

"실시간으로 변경된 걸 어떻게 알지? 1초마다 SELECT를 날려보면 안 되나?" 안 된다. 1초마다 SELECT를 날리면 1초마다 DB CPU가 깎여나가서 결국 서버가 죽는다.

그래서 천재적인 개발자들은 **트랜잭션 로그(Transaction Log)**에 눈을 돌렸다.

  • 데이터베이스는 정전 시 복구를 위해 무조건 **Redo Log(오라클)나 Binlog(MySQL)**라는 파일에 모든 변경 사항을 먼저 적어둔다 (WAL 프로토콜 - 456번 문서).
  • CDC 도구(Debezium 등)는 DB 엔진인 척 위장하고 이 로그 파일에 조용히 빨대를 꽂는다.
  • 테이블을 SELECT 하는 게 아니라, 그냥 하드디스크에 쌓이는 텍스트 로그 파일만 가만히 읽어 들인다.
  • 결과: 운영 중인 DB 서버의 CPU와 메모리에 부하를 단 1%도 주지 않으면서, 모든 변경 사항을 빛의 속도로 훔쳐 올 수 있다!

Ⅲ. 실무 아키텍처: 카프카(Kafka)와의 완벽한 콤비

CDC로 뽑아낸 데이터는 어디로 갈까? 보통 **아파치 카프카(Apache Kafka)**라는 거대한 파이프라인에 실린다.

  1. Source DB (MySQL): 고객이 전화번호를 바꾼다 (UPDATE).
  2. CDC 툴 (Debezium): MySQL의 Binlog를 읽고 "전화번호 바뀜 이벤트"를 낚아채서 카프카에 쏜다.
  3. Kafka (파이프라인): 이 이벤트를 잘 보관하며 컨베이어 벨트 위로 흘려보낸다.
  4. Target DB (소비자들):
    • 마케팅팀의 Snowflake(DW)가 카프카에서 이벤트를 줏어 먹고 고객 주소록을 업데이트한다.
    • 검색팀의 ElasticSearch가 이벤트를 줏어 먹고 검색 색인을 업데이트한다.
┌──────────────────────────────────────────────────────────────┐
│           로그 기반 CDC (Change Data Capture) 아키텍처 시각화         │
├──────────────────────────────────────────────────────────────┤
│                                                              │
│ [ 🛍️ 운영 DB (MySQL) ]                                       │
│  1. 사용자가 1만 원 결제 (INSERT)                               │
│  2. DB가 몰래 Binlog에 기록 ──┐                               │
│                             │                                │
│ [ 🕵️ Debezium (CDC) ] ◀─────┘ (Binlog에 빨대 꽂고 몰래 읽음)     │
│   "오! 방금 1만 원 결제 떴다! 카프카로 쏴!"                          │
│        │                                                     │
│        ▼ (Event Stream)                                      │
│ [ 🌊 Apache Kafka ] (데이터 고속도로)                            │
│        │───────────────┬────────────────┐                    │
│        ▼               ▼                ▼                    │
│ [ 📊 마케팅 통계 DB ]  [ 🔍 검색 엔진 DB ] [ 🤖 AI 추천 시스템 ] │
│                                                              │
│ ★ 특징: 운영 DB는 자기 할 일(결제)만 할 뿐, 뒤에서 누가 퍼가는지 신경 안 써도 됨!│
└──────────────────────────────────────────────────────────────┘

Ⅳ. 결론

"데이터는 고여있는 연못이 아니라, 흐르는 강물이다." CDC 기술이 상용화되면서 데이터 엔지니어링의 패러다임은 '배치(Batch)'에서 '실시간 스트리밍(Real-time Streaming)'으로 완전히 뒤바뀌었다. 과거에는 ETL(483번 문서) 서버가 밤마다 낑낑대며 데이터를 퍼 날랐지만, 이제는 CDC와 Kafka가 결합하여 데이터가 생성되는 그 찰나의 순간에 전 세계 모든 부서의 대시보드 화면을 동시에 업데이트하는 시대가 되었다. 마이크로서비스(MSA) 환경에서 찢어져 있는 수십 개의 데이터베이스 동기화를 고민하고 있다면, CDC는 선택이 아니라 생존을 위한 필수 아키텍처다.


📌 관련 개념 맵

  • 핵심 인프라: Transaction Log (Redo Log, Binlog - 455, 456번 문서)
  • 메시지 브로커: Apache Kafka, RabbitMQ
  • 대표 CDC 도구: Debezium, Oracle GoldenGate, AWS DMS
  • 소프트웨어 아키텍처: 이벤트 기반 아키텍처 (EDA - Event-Driven Architecture)

👶 어린이를 위한 3줄 비유 설명

  1. 구식 방법(Batch)은 선생님이 수업 끝난 뒤에 교탁에 있는 '제출된 숙제 더미'를 한꺼번에 들고 교무실로 가는 거예요. (한 번에 가지만 결과 확인이 늦죠)
  2. CDC는 교탁에 마법의 '스캐너'를 달아놓은 거예요. 학생이 숙제를 교탁에 올려놓는 딱 그 찰나의 순간! 스캐너가 찰칵! 하고 사진을 찍죠.
  3. 그리고 그 사진을 1초 만에 선생님 휴대폰으로 바로 쏴주는 거예요! 선생님은 교실에 안 오고도 누가 방금 숙제를 냈는지 실시간으로 알 수 있답니다!