490. CDC (변경 데이터 캡처) 스트림 추출
⚠️ 이 문서는 매일 밤 12시에 1억 건의 데이터를 통째로 복사해 가는 구식 배치(Batch) 작업의 한계를 부수고, **데이터베이스에서 무언가 수정(UPDATE)되는 그 '찰나의 순간'을 낚아채서 0.1초 만에 다른 시스템으로 실시간 배달해 주는 마법의 파이프라인인 'CDC'**를 다룹니다.
핵심 인사이트 (3줄 요약)
- 본질: Change Data Capture. 데이터베이스에 발생하는
INSERT,UPDATE,DELETE이벤트(변경 사항)를 실시간으로 추적하고 캡처하여 다른 시스템(DW, 검색 엔진 등)으로 흘려보내는 기술이다.- 작동 원리 (Log-based): 진짜 데이터 테이블을
SELECT로 무식하게 긁어오는 게 아니라, 데이터베이스가 복구를 위해 몰래 적어두는 '트랜잭션 로그(Redo Log, Binlog)'를 빨대 꽂고 훔쳐보는 방식을 쓴다. (DB 성능 저하 0%)- 가치: "어제 매출 통계"가 아니라 "지금 이 순간의 실시간 매출 대시보드"를 만들 수 있게 해주며, MSA 환경에서 서로 다른 서비스 간의 데이터 동기화를 완벽하게 해결해 준다.
Ⅰ. 개요: 12시의 종이 울리면 (Context & Necessity)
"검색용 DB(ElasticSearch)에 방금 가입한 유저 정보 좀 동기화해 줘!"
- 과거의 방식 (Batch & Polling):
- 매일 밤 12시마다
SELECT * FROM Users WHERE 가입일 = 오늘쿼리를 날려서 10만 건을 통째로 퍼간다. - 문제점: 낮 12시에 가입한 유저는 밤 12시까지 12시간 동안 검색이 안 된다. 실시간(Real-time)이 아니며, 밤 12시만 되면 DB 서버가 퍼나르는 쿼리 때문에 죽어 나간다.
- 매일 밤 12시마다
**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)**라는 거대한 파이프라인에 실린다.
- Source DB (MySQL): 고객이 전화번호를 바꾼다 (
UPDATE). - CDC 툴 (Debezium): MySQL의 Binlog를 읽고 "전화번호 바뀜 이벤트"를 낚아채서 카프카에 쏜다.
- Kafka (파이프라인): 이 이벤트를 잘 보관하며 컨베이어 벨트 위로 흘려보낸다.
- 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줄 비유 설명
- 구식 방법(Batch)은 선생님이 수업 끝난 뒤에 교탁에 있는 '제출된 숙제 더미'를 한꺼번에 들고 교무실로 가는 거예요. (한 번에 가지만 결과 확인이 늦죠)
- CDC는 교탁에 마법의 '스캐너'를 달아놓은 거예요. 학생이 숙제를 교탁에 올려놓는 딱 그 찰나의 순간! 스캐너가 찰칵! 하고 사진을 찍죠.
- 그리고 그 사진을 1초 만에 선생님 휴대폰으로 바로 쏴주는 거예요! 선생님은 교실에 안 오고도 누가 방금 숙제를 냈는지 실시간으로 알 수 있답니다!