시드(Seeds)로 DAG에 정적 데이터 더하기

시드(Seeds)로 DAG에 정적 데이터 더하기

dbt 프로젝트를 만들다 보면 "이 값들은 데이터베이스에서 새로 뽑기보다 파일로 두고 참조하면 훨씬 깔끔하겠다" 싶은 데이터가 있어요. 이럴 때 쓰는 게 바로 **시드(Seed)**예요. 시드는 프로젝트 안에 둔 CSV 파일을 dbt seed 명령으로 웨어하우스에 테이블로 올려 주는 기능이죠. 시드는 저장소에 같이 들어가므로 버전 관리와 코드 리뷰가 되고, 자주 바뀌지 않는 정적 데이터에 가장 잘 어울려요.

출처: dbt 공식 문서 — Add Seeds to your DAG

시드가 잘 어울리는 경우, 안 어울리는 경우

시드는 그때그때 갱신되기보다 한 번 정해 두고 계속 참조하는 데이터에 좋아요. 좋은 예시를 볼게요.

  • 국가 코드를 나라 이름으로 바꿔 주는 매핑 목록
  • 분석에서 제외할 테스트 이메일 목록
  • 직원 계정 ID 목록

반대로 다음 같은 경우에는 쓰지 않는 편이 좋아요.

  • CSV로 내보낸 로우(raw) 데이터를 그대로 올릴 때 — 로우 데이터는 파이프라인으로 다루는 게 맞아요
  • 개인정보(PII)나 비밀번호 같은 민감 정보가 담긴 운영 데이터 — 시드는 코드 리뷰 대상이라 비밀값을 두면 안 돼요

시드 파일 올리기

시드를 프로젝트에 올리려면 먼저 seeds 디렉터리에 .csv 확장자로 파일을 추가해요. 예를 들어 seeds/country_codes.csv 파일을 만들었다고 해 볼게요.

country_code,country_name
US,United States
CA,Canada
GB,United Kingdom
...

이제 dbt seed 명령을 실행하면 타깃 스키마에 country_codes라는 이름의 새 테이블이 만들어져요.

$ dbt seed

Found 2 models, 3 tests, 0 archives, 0 analyses, 53 macros, 0 operations, 1 seed file

14:46:15 | Concurrency: 1 threads (target='dev')
14:46:15 |
14:46:15 | 1 of 1 START seed file analytics.country_codes........................... [RUN]
14:46:15 | 1 of 1 OK loaded seed file analytics.country_codes....................... [INSERT 3 in 0.01s]
14:46:16 |
14:46:16 | Finished running 1 seed in 0.14s.

Completed successfully

Done. PASS=1 ERROR=0 SKIP=0 TOTAL=1

시드는 일반 모델과 똑같이 ref 함수로 하위 모델에서 참조할 수 있어요. 시드로 만든 테이블을 그대로 가져다 쓰는 예시예요.

-- This refers to the table created from seeds/country_codes.csv
select * from {{ ref('country_codes') }}

시드 설정과 문서화

시드는 dbt_project.yml에서 설정해요. 사용할 수 있는 설정의 전체 목록은 seed configurations 문서에서 확인할 수 있어요. YAML에 속성(properties)을 선언해 시드를 문서화하고 테스트할 수도 있어요 — 자세한 내용은 seed properties 문서를 참고하면 돼요.

더 알아보기