← 학습 카테고리

Learn

dbt

11개 모듈 · 현재 7번째

dbt 모듈 7/11 dbt-learn-07

지연 도착 데이터, 스냅샷(SCD Type 2), {{ this }}

50 dbt Interview Questions for Data Engineers (Real Answers, 2026) — 미상 (데이터 엔지니어링 커리어 블로그, 2026) Section 3: Incremental Models & Performance, Q26-Q28 (pp.8-9)

이 모듈을 다 읽으면

  • 지연 도착 데이터를 룩백 버퍼 윈도우로 처리하는 패턴과 그 한계를 설명할 수 있다
  • 스냅샷이 SCD Type 2 이력을 어떻게 기록하며 증분 모델과 무엇이 다른지 설명할 수 있다
  • {{ this }} 변수가 어떤 맥락에서만 유효한지 판단할 수 있다

지연 도착 데이터는 단순 MAX(timestamp) 대신 몇 시간의 버퍼 윈도우를 빼서 최근 구간을 겹쳐 재처리하는 방식으로 다루며, merge 전략과 unique_key를 함께 써야 중복이 생기지 않는다. 스냅샷은 dbt_valid_from/dbt_valid_to 컬럼으로 행 변경 이력을 SCD Type 2 방식으로 기록하는 기능으로, 최신 상태만 신경 쓰는 증분 모델과 달리 특정 시점의 상태를 조회할 수 있게 해준다. {{ this }}는 현재 모델의 이미 구체화된 테이블을 가리키며 사실상 is_incremental() 블록 안에서만 쓰인다.

지연 도착 데이터와 버퍼 윈도우

단순한 MAX(timestamp) 룩백 대신, 버퍼 윈도우를 빼는 방식을 쓴다: {% if is_incremental() %} WHERE event_timestamp > (SELECT DATEADD(hour, -3, MAX(event_timestamp)) FROM {{ this }}) {% endif %}. 이 3시간 겹침(overlap)은 늦게 도착했을 수 있는 최근 행들을 다시 처리한다. 이 겹침이 중복을 만들지 않도록 merge 전략과 unique_key를 함께 써야 한다. 버퍼 크기는 원천 시스템의 지연 특성에 따라 다르다 — 스트리밍이라면 3시간, 배치 벤더 피드라면 1~2일 정도로 잡는다.

참고: 모듈 dbt-blog-draft-05에서 다뤘듯, dbt-core 1.9부터는 이런 수동 버퍼 윈도우 패턴 대신 microbatch 전략(event_time/batch_size/lookback 설정)으로 이 문제를 표준화해서 처리할 수 있다. 신규 프로젝트라면 수동 DATEADD 버퍼보다 microbatch를 우선 검토하는 것이 좋다.

핵심 포인트

  • 지연 도착 데이터는 MAX(timestamp)에서 몇 시간을 뺀 버퍼 윈도우로 최근 구간을 겹쳐 재처리해 처리한다
  • 겹침이 중복을 만들지 않도록 merge 전략 + unique_key를 함께 사용해야 한다
  • 버퍼 크기는 원천 시스템의 지연 특성에 따라 조정한다(스트리밍 수시간, 배치 피드 1~2일)
  • dbt-core 1.9부터는 이 수동 패턴을 microbatch 전략으로 표준화해서 대체할 수 있다

스냅샷(SCD Type 2)과 {{ this }}

스냅샷은 행 수준 변경을 시간에 따라 추적해 서서히 변화하는 차원(SCD Type 2)을 포착한다. 각 버전의 행이 언제부터 언제까지 유효했는지 기록하기 위해 dbt_valid_from과 dbt_valid_to 컬럼을 추가한다. 증분 모델은 데이터의 최신 상태만 신경 쓰지만, 스냅샷은 전체 이력을 보존한다. '이 고객의 요금제가 3월 1일에는 무엇이었는가?' 같은 질문에 답해야 하는 차원 테이블에는 스냅샷을 쓴다.

{{ this }}는 현재 모델의 이미 구체화된 테이블을 데이터베이스 완전 한정 이름으로 반환한다. 룩백 쿼리를 위해 기존 테이블을 참조할 목적으로 {% if is_incremental() %} 블록 안에서 거의 독점적으로 쓰인다. 증분 모델 밖에서는 거의 필요하지 않다. 흔한 오류는 view materialization에서 {{ this }}를 쓰는 것인데, 이 경우 실패하거나 오래된 오브젝트를 참조하게 된다.

참고: 원문은 스냅샷을 항상 {% snapshot %}...{% endsnapshot %} Jinja 블록으로 감싼 .sql 파일로만 정의하는 것을 전제로 설명한다. dbt-core 1.9(2024년 말)부터는 스냅샷 설정을 YAML 파일에서도 정의할 수 있게 됐다 — 기존 .sql 기반 방식도 계속 지원되지만, 신규 프로젝트에서는 다른 리소스와 마찬가지로 YAML로 설정을 선언하는 방식이 권장되는 방향이다.

핵심 포인트

  • 스냅샷은 dbt_valid_from/dbt_valid_to 컬럼으로 행 버전별 유효 기간을 기록해 SCD Type 2 이력을 보존한다
  • 증분 모델은 최신 상태만, 스냅샷은 특정 시점의 과거 상태까지 조회 가능하게 한다
  • {{ this }}는 현재 모델의 이미 구체화된 테이블을 가리키며 is_incremental() 블록 밖(특히 view)에서 쓰면 오류나 오래된 참조로 이어진다
  • dbt-core 1.9부터 스냅샷도 YAML로 설정할 수 있게 됐다 — 정정(원문은 .sql 블록 방식만 전제)