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