dbt Reference
dbt Jinja 매크로, 설정 파일, 테스트 문법 레퍼런스
dbt Reference 소개
dbt 레퍼런스는 SQL 기반 데이터 변환 파이프라인을 담당하는 애널리틱스 엔지니어를 위한 간결하고 검색 가능한 치트 시트입니다. 모델(SELECT 기반 모델 정의, ref(), source(), 점진적 패턴), 테스트(unique, not_null, accepted_values, relationships), 매크로({% macro %}를 이용한 Jinja 매크로), CLI(dbt run, dbt test, dbt build, dbt compile), 설정(config(), SCD Type 2 스냅샷, seed) 등 5개 카테고리로 구성됩니다. 모든 항목에 바로 사용할 수 있는 실제 YAML 또는 SQL 코드 예제가 포함됩니다.
dbt는 ELT 파이프라인의 Transform 단계를 담당하는 표준 도구로, 애널리틱스 엔지니어가 모듈화되고 버전 관리되는 SQL을 작성할 수 있게 합니다. 이 레퍼런스는 Snowflake, BigQuery, Redshift, Databricks에서 dbt로 스테이징 모델, 중간 모델, 마트를 구축하는 엔지니어에게 특히 유용합니다. 모델 섹션은 모델 간 의존성을 위한 ref() 함수와 업스트림 원시 테이블을 선언하는 source() 함수를 다룹니다. 점진적 모델 패턴은 is_incremental()을 사용하여 전체 데이터셋을 재처리하지 않고 각 실행마다 새 데이터만 처리하는 방법을 보여줍니다.
테스트 섹션은 schema.yml에서 정의하는 dbt의 4가지 내장 제네릭 테스트를 다룹니다: unique(열에 중복 값 없음), not_null(NULL 값 없음), accepted_values(허용 목록 내의 값만), relationships(모델 간 참조 무결성). 매크로 섹션은 cents_to_dollars 같은 재사용 가능한 Jinja 매크로를 작성하고 어느 모델 SQL에서든 호출하는 방법을 보여줍니다. CLI 섹션은 주요 dbt 명령어를 다룹니다: dbt run(모델 실행), dbt test(데이터 품질 검증), dbt build(run + test 통합), dbt compile(생성된 SQL 미리보기). 설정 섹션은 SCD Type 2 이력 추적을 위한 스냅샷과 정적 CSV 참조 데이터 로드를 위한 시드를 다룹니다.
주요 기능
- 5개 카테고리: 모델, 테스트, 매크로, CLI, 설정 — SQL 및 YAML 예제 포함
- ref()를 이용한 모델 간 의존성과 source()를 이용한 원시 소스 테이블 선언
- is_incremental()을 사용하여 각 실행마다 새 데이터만 처리하는 점진적 모델 패턴
- dbt 4가지 내장 제네릭 테스트: unique, not_null, accepted_values, relationships
- {% macro %}와 {% endmacro %}를 사용한 재사용 가능한 SQL 로직을 위한 Jinja 매크로 작성
- CLI 명령어: dbt run, dbt test, dbt build(통합), dbt compile(SQL 미리보기)
- config() 매크로로 구체화(table/view/incremental), 스키마, unique_key 설정
- SCD Type 2 이력 추적을 위한 스냅샷과 정적 CSV 참조 데이터 로드를 위한 시드
자주 묻는 질문
dbt란 무엇이고 기존 ETL 도구와 어떻게 다른가요?
dbt(data build tool)는 ELT 파이프라인의 Transform 단계를 처리합니다. 시스템 간 데이터를 이동하고 변환하는 기존 ETL 도구와 달리, dbt는 데이터 웨어하우스 내부에서만 실행됩니다. SELECT 문을 작성하면 dbt가 컴파일하여 CREATE TABLE 또는 CREATE VIEW 문으로 실행합니다. dbt는 데이터 변환에 소프트웨어 엔지니어링 관행을 도입합니다: Git 버전 관리, schema.yml을 통한 자동화 테스트, 문서화, 데이터 흐름을 보여주는 계보 그래프.
dbt에서 ref()와 source()의 차이는 무엇인가요?
ref()는 다른 dbt 모델을 참조하는 데 사용합니다. DAG에 의존성을 생성하여 참조된 모델이 먼저 실행되도록 합니다. 예를 들어 SELECT * FROM {{ ref("stg_orders") }}는 stg_orders.sql 모델을 참조합니다. source()는 Fivetran 같은 외부 수집 도구에서 데이터가 오는, dbt가 관리하지 않는 원시 테이블을 참조하는 데 사용합니다. sources.yml 파일에서 소스를 선언합니다. source() 사용으로 원시 테이블이 계보 그래프에 포함되고 소스 신선도 검사를 실행할 수 있습니다.
dbt의 점진적 모델은 어떻게 작동하나요?
점진적 모델은 전체 데이터셋을 재처리하지 않고 각 실행마다 새 데이터나 변경된 데이터만 처리합니다. 필터 조건을 {% if is_incremental() %}...{% endif %} 안에 감싸면 초기 빌드가 아닌 점진적 실행에서만 적용됩니다. 예를 들어 WHERE event_date > (SELECT MAX(event_date) FROM {{ this }})는 새 이벤트만 필터링합니다. config() 블록에 materialized="incremental"과 unique_key를 설정합니다. 첫 실행에서는 전체 테이블을 빌드하고, 이후 실행에서는 새 행만 UPSERT(MERGE)합니다.
dbt 제네릭 테스트란 무엇이고 어떻게 정의하나요?
dbt 제네릭 테스트는 모델 옆의 schema.yml YAML 파일에 정의하는 데이터 품질 검사입니다. 4가지 내장 제네릭 테스트: unique(열에 중복 값 없음 확인), not_null(NULL 값 없음 확인), accepted_values(지정된 목록의 값인지 확인), relationships(참조 무결성 확인 — 열의 모든 값이 다른 모델의 키로 존재하는지). 열의 tests: 키 아래에 정의합니다. dbt test로 실행합니다. 실패한 테스트는 기본적으로 경고를 생성하며, 심각도를 error로 설정하면 파이프라인을 실패시킵니다.
dbt 매크로란 무엇이고 언제 사용하나요?
dbt 매크로는 macros/ 디렉토리에 {% macro name(args) %} ... {% endmacro %}로 정의하는 재사용 가능한 Jinja 템플릿 코드입니다. 어떤 모델 SQL에서든 {{ macro_name(args) }}로 호출합니다. 매크로는 모델 간 SQL 반복을 제거합니다. 예를 들어 cents_to_dollars 매크로는 정수 센트를 십진수 달러로 변환하며 어떤 모델에서든 호출할 수 있습니다. 단위 변환, 반복되는 CASE 문, 동적 컬럼 생성, 크로스 데이터베이스 SQL 추상화에 사용하세요.
dbt run, dbt test, dbt build의 차이는 무엇인가요?
dbt run은 모든 모델 SQL 파일을 실행하고 웨어하우스에 테이블이나 뷰로 구체화합니다. dbt test는 schema.yml 파일에 정의된 모든 테스트를 실행합니다. 제네릭 테스트(unique, not_null 등)와 커스텀 단일 테스트 모두 포함합니다. dbt build는 올바른 순서로 dbt run과 dbt test를 함께 실행합니다. 각 모델을 실행하고 즉시 테스트한 후 다운스트림 모델로 진행합니다. CI/CD 파이프라인에서는 가장 철저한 실행을 위해 dbt build를 사용하세요. --select model_name을 추가하면 특정 모델이나 서브그래프를 타겟팅할 수 있습니다.
dbt 스냅샷이란 무엇이고 언제 사용하나요?
dbt 스냅샷은 SCD(천천히 변하는 차원) Type 2 이력 추적을 구현합니다. 소스 테이블의 주기적인 "스냅샷"을 찍고 dbt_valid_from과 dbt_valid_to 열을 추가하여 레코드 변경 이력을 추적합니다. 행이 변경되면(타임스탬프 또는 모든 열의 해시로 감지) 스냅샷은 새 행을 삽입하고 이전 행을 닫습니다. 업데이트 시 레코드를 덮어쓰는 CRM 연락처 테이블처럼 자체 변경 이력을 유지하지 않는 소스 테이블의 이력을 보존할 때 사용합니다.
dbt 시드란 무엇이고 언제 사용하나요?
dbt 시드는 seeds/ 디렉토리의 정적 CSV 파일을 데이터 웨어하우스에 테이블로 로드합니다. dbt seed로 로드합니다. 모델에서 {{ ref("seed_name") }}으로 참조합니다. 시드는 거의 변경되지 않는 소규모 정적 조회 테이블에 적합합니다. 국가 코드, 주 약자, 카테고리 매핑, 코스트 센터 코드 등이 예시입니다. 대용량 데이터셋(dbt는 몇 MB 미만 권장)이나 자주 변경되는 데이터에는 시드를 사용하지 마세요. 자주 업데이트되는 조회 데이터는 ELT 파이프라인으로 수집된 소스 테이블을 사용하세요.