dbt
근본적인 장점은, SQL transformation을 소프트웨어 개발처럼 관리한다는 것에 있다.
SQL 간 의존관계 / 테스트 / 재사용 / 실행범위 / 물리화 방식을 하나의 모델링 체계로 만드는 것이 목적.
- dbt 공식 문서 기준:
- 모델
- 테스트
- lineage
- state-aware build
- Semantic Layer
dbt 라는 추상화 레이어를 하나 두는 것으로, 아래와 같은 이득을 얻을 수 있다.
- SQL 형상관리
- 협업 환경
- 가독성 개선
dbt 의 오케스트레이션을 위해 airflow 가 사용될 수 있다.
| 디렉터리 | 역할 | 실제 DB 객체 생성 여부 | 주 사용 시점 |
|---|---|---|---|
models/ | 실행용 SQL 보관 | 경우에 따라 | |
analyses/ | 실행용이 아닌 분석 SQL 보관 | X | 임시 분석/리포트 SQL |
logs/ | dbt 실행 로그 저장 | X | 디버깅 |
macros/ | Jinja macro/재사용 SQL 함수 | X | SQL 템플릿화 |
seeds/ | CSV를 테이블로 적재 | O | 작은 기준정보/코드테이블 |
snapshots/ | 변경 이력 추적(SCD Type 2) | O | 원본 레코드 변경 이력 |
target/ | compile/run 결과 artifact | X | compiled SQL, manifest 등 |
tests/ | custom data test SQL | 자체는 보통 X | 데이터 품질 검증 |
# 실제 테이블로 저장. 데이터가 자주 변경되지 않고, 쿼리 성능이 중요할 경우 사용
{{ config(materialized='table') }}
# 쿼리를 뷰로 저장. 저장 공간을 절약할 수 있지만, 쿼리 성능이 떨어질 수 있음. 다만 원본 데이터가 바뀌면 바로 볼 수 있음(최신 데이터 확인 가능)
{{ config(materialized='view') }}
# 테이블에 새로운, 변경된 데이터만 추가함
{{ config(materialized='incremental') }}
# 실제로 물리화되지 않고, 다른 모델에서 참조될 때 서브 쿼리로 사용
{{ config(materialized='view') }}- Snowflake + dbt에서
materialized='view'라면, 그 모델이dbt run대상에 포함될 때마다 view 정의를 다시 적용한다.
macros
- 서로 다른 dbt project 간에 통용되는 1개의 macro
dbt-common-macros/
├── dbt_project.yml
└── macros/
└── date_interval_filter.sql
project-a/
├── dbt_project.yml
├── packages.yml
└── models/
project-b/
├── dbt_project.yml
├── packages.yml
└── models/
| 방법 | 가능 여부 | 권장도 | 특징 |
|---|---|---|---|
| 각 프로젝트에 macro 복붙 | O | 낮음 | 수정 시 모든 프로젝트 변경 필요 |
| 공용 Git dbt package | O | 높음 | 버전 관리/재사용 용이 |
| 하나의 Snowflake SQL UDF로 구현 | O | 경우에 따라 | dbt compile logic에는 부적합 |
| Snowflake stored procedure | O | 낮음 | macro와 역할이 다름 |