전체 그래프
dbt

Sources & Seeds

data-engineeringdbtsourceseed

상위: dbt

요약

Sources는 웨어하우스에 이미 존재하는 외부 테이블을 dbt 프로젝트에서 선언적으로 참조하는 방법이다. Seeds는 CSV 파일을 웨어하우스에 테이블로 적재하는 기능이다. 둘 다 dbt 모델의 입력 데이터 역할을 한다.

Sources

선언

# models/staging/_sources.yml
version: 2

sources:
  - name: jaffle_shop
    database: raw
    schema: jaffle_shop
    tables:
      - name: orders
        description: "주문 원본 데이터"
        loaded_at_field: _etl_loaded_at
        freshness:
          warn_after: {count: 12, period: hour}
          error_after: {count: 24, period: hour}
      - name: customers
        description: "고객 원본 데이터"

모델에서 참조

-- models/staging/stg_orders.sql
SELECT *
FROM {{ source('jaffle_shop', 'orders') }}

source() 함수를 사용하면:

  • 리니지 그래프에 원본 테이블이 포함된다
  • 데이터베이스/스키마 정보를 YAML에서 중앙 관리한다
  • Freshness 체크를 적용할 수 있다

Source Freshness

dbt source freshness

소스 테이블의 최신 적재 시점을 확인한다. loaded_at_field를 기준으로 데이터가 얼마나 오래되었는지 판단하고, warn_after/error_after 조건에 따라 경고 또는 에러를 발생시킨다.

EL 단계(Fivetran, Airbyte 등)에서 문제가 생겨 데이터가 늦게 도착하면 이를 감지할 수 있다.

Seeds

개념

Seeds는 프로젝트 내 CSV 파일을 웨어하우스 테이블로 적재하는 기능이다.

seeds/
├── country_codes.csv
├── employee_mapping.csv
└── status_definitions.csv

사용 예시

# seeds/country_codes.csv
code,country_name,region
US,United States,North America
KR,South Korea,Asia
JP,Japan,Asia
dbt seed    # CSV를 웨어하우스 테이블로 적재
-- models에서 참조
SELECT *
FROM {{ ref('country_codes') }}

적합한 사용처

  • 매핑 테이블: 국가 코드, 상태 코드, 카테고리 매핑
  • 정적 참조 데이터: 자주 변경되지 않는 소규모 룩업 테이블
  • 테스트 데이터: accepted_values 테스트의 기준 데이터

부적합한 사용처

  • 대용량 데이터 (수천 행 이상)
  • 자주 변경되는 데이터
  • 원본 시스템에서 직접 가져올 수 있는 데이터

Seeds는 소규모 정적 데이터에만 사용해야 한다. 대용량이나 동적 데이터는 EL 도구로 적재하고 Source로 선언한다.

Sources vs Seeds

구분SourcesSeeds
데이터 위치웨어하우스에 이미 존재CSV 파일 → 웨어하우스 적재
적재 주체외부 EL 도구dbt seed 명령
크기제한 없음소규모 (수백 행)
변경 빈도실시간/배치거의 변경 없음
참조 함수source()ref()

관련 개념

  • Models: Sources와 Seeds를 입력으로 사용하는 변환 단위
  • Tests: Sources와 Seeds에도 테스트를 적용할 수 있다