이 문서는 데이터 엔지니어링 섹션의 일부입니다.
왜 CDC가 필요한가?
운영 데이터베이스(OLTP)에서는 데이터가 끊임없이 INSERT, UPDATE, DELETE됩니다. 이러한 변경사항을 분석 시스템(데이터 레이크하우스)에 반영해야 하는데, 매번 전체 테이블을 복사하는 것은 비용이 높은입니다.💡 CDC(Change Data Capture) 는 소스 데이터베이스에서 발생하는 변경사항만 감지하여 타겟 시스템에 반영하는 기술입니다. 전체 데이터를 매번 복사하는 대신, 변경된 부분만 캡처하므로 네트워크 대역폭, 처리 시간, 비용을 크게 절감할 수 있습니다.
전체 복사 vs CDC 비교
CDC 데이터 흐름
SCD(Slowly Changing Dimension) 유형
CDC로 캡처한 변경사항을 타겟 테이블에 어떻게 반영 할지 결정하는 전략을 SCD라고 합니다.💡 SCD(Slowly Changing Dimension) 는 데이터 웨어하우스에서 “서서히 변하는 데이터”(예: 고객 주소, 직원 부서)를 어떻게 관리할지 정의하는 설계 패턴입니다. Ralph Kimball이 제시한 개념으로, Type 0부터 Type 4까지 다양한 유형이 있습니다.
SCD 유형 비교
💡 SDP에서는 가장 많이 사용되는 Type 1 과 Type 2 를 APPLY CHANGES INTO 구문으로 직접 지원합니다.
APPLY CHANGES INTO 구문 상세
기본 구조
주요 절(Clause) 설명
SCD Type 1 구현: 최신값 덮어쓰기
SCD Type 1은 변경이 발생하면 기존 값을 최신 값으로 교체 합니다. 이력을 보존하지 않으며, 항상 현재 상태 만 유지합니다.SQL 예제
Python 예제
동작 예시
소스 CDC 레코드:
SCD Type 1 결과 (silver_customers):
항상 최신 상태만 유지됩니다. “김철수가 서울에 살았다”는 이력은 사라집니다.
SCD Type 2 구현: 이력 추적
SCD Type 2는 변경이 발생하면 기존 레코드를 만료 처리하고 새 레코드를 추가 합니다. 전체 변경 이력이 보존됩니다.SQL 예제
자동 생성되는 메타 컬럼
SCD Type 2로 저장하면 다음 시스템 컬럼이 자동으로 추가됩니다.동작 예시
소스 CDC 레코드 (동일한 데이터):
SCD Type 2 결과 (silver_customers_history):
__END_AT이 NULL인 행이 현재 유효한 최신 레코드 입니다.
현재 유효한 레코드만 조회
TRACK HISTORY ON: 선택적 이력 추적
모든 컬럼 변경이 아닌, 특정 컬럼이 변경될 때만 이력을 기록하고 싶다면TRACK HISTORY ON 절을 사용합니다.
💡TRACK HISTORY ON *(기본값)은 모든 컬럼 변경을 추적합니다.TRACK HISTORY ON * EXCEPT (last_login_at)형태로 특정 컬럼을 제외할 수도 있습니다.
DELETE 처리
Soft Delete (삭제 표시만)
CDC 소스에서 DELETE 이벤트를 받으면, 타겟에서 해당 레코드를 실제로 삭제하는 대신 삭제 표시 만 할 수 있습니다. SCD Type 2에서는__END_AT이 설정되어 만료 처리됩니다.
SCD Type 2에서 DELETE를 적용하면, 해당 레코드의 __END_AT이 설정되어 “만료됨”으로 표시됩니다. 물리적으로 삭제되지는 않습니다.
Hard Delete (물리적 삭제)
SCD Type 1에서 DELETE를 적용하면, 해당 레코드가 타겟 테이블에서 물리적으로 삭제 됩니다.DELETE 처리 비교
소스별 CDC 패턴
CDC 데이터를 생성하는 도구에 따라 이벤트 형식이 다릅니다.Debezium 형식 처리
Debezium은 오픈소스 CDC 도구로, Kafka를 통해 변경 이벤트를 전달합니다.Lakeflow Connect
Databricks의 관리형 커넥터인 Lakeflow Connect를 사용하면 CDC 데이터가 표준화된 형식으로 자동 수집됩니다.커스텀 CDC (Application 레벨)
애플리케이션에서 직접 변경 로그를 생성하는 경우:실습: CDC 파이프라인 전체 예제
고객 데이터의 CDC 처리를 Bronze → Silver → Gold 전체 과정으로 구현하는 예제입니다.성능 고려사항
대용량 CDC 처리 팁
순서 보장
⚠️ SEQUENCE BY 컬럼은 동일한 키에 대해 변경 순서를 올바르게 반영 해야 합니다. 동일한 키에 대해 같은 시퀀스 값을 가진 여러 레코드가 있으면, 하나만 임의로 선택됩니다. 타임스탬프의 정밀도가 충분하지 않은 경우 별도의 시퀀스 번호 컬럼 사용을 권장합니다.