dbt-변환-패턴은(는) 무엇을 하나요?
애널리틱스 엔지니어링을 위한 dbt(data build tool) 마스터: 모델 구성, 테스트, 문서화, 증분 전략. 데이터 변환 구축, 데이터 모델 생성 또는 애널리틱스 엔지니어링 모범 사례 구현 시 사용하세요.
개요
이 가이드는 dbt(Data Build Tool)를 사용한 효과적인 데이터 변환 패턴을 설명합니다. 다음을 다룹니다:
- 모델 구성: 소스에서 스테이징, 중간, 마트로의 계층적 모델링
- 테스트: 데이터 무결성 및 비즈니스 논리 검증을 위한 제약 조건 기반 테스트
- 문서화:
dbt docs generate를 통한 자동 문서 생성 - 증분 전략: 대규모 데이터셋을 위한 증분 모델, 스냅샷, 브릿지 테이블
지원 플랫폼
- Claude Code
- Cursor
- Codex
- 기타 AI 어시스턴트 도구
환경 설정
시작하기 전에 다음이 설치되어 있는지 확인하세요:
pip install dbt-core dbt-postgres # 또는 dbt-bigquery, dbt-snowflake 등
프로젝트 구조
권장 dbt 프로젝트 구조:
my_dbt_project/
├── models/
│ ├── staging/
│ │ ├── schema.yml
│ │ └── stg_orders.sql
│ ├── intermediate/
│ │ └── int_order_totals.sql
│ └── marts/
│ ├── marketing/
│ │ └── dim_customers.sql
│ └── finance/
│ └── fct_orders.sql
├── tests/
│ ├── assert_positive_total.sql
│ └── relationships.yml
├── analyses/
├── snapshots/
├── seeds/
├── macros/
├── docs/
├── dbt_project.yml
└── profiles.yml
핵심 패턴
1. 소스 정의 및 스테이징 모델
models/staging/schema.yml 파일에 소스를 정의하세요:
version: 2
sources:
- name: raw
database: production
schema: public
tables:
- name: orders
description: "원시 주문 데이터"
models/staging/stg_orders.sql:
WITH source AS (
SELECT * FROM {{ source('raw', 'orders') }}
),
renamed AS (
SELECT
id AS order_id,
customer_id,
order_date,
total_amount,
status
FROM source
)
SELECT * FROM renamed
2. 중간 모델 (비즈니스 논리 적용)
models/intermediate/int_order_totals.sql:
WITH orders AS (
SELECT * FROM {{ ref('stg_orders') }}
),
order_totals AS (
SELECT
customer_id,
COUNT(DISTINCT order_id) AS total_orders,
SUM(total_amount) AS lifetime_value
FROM orders
GROUP BY 1
)
SELECT * FROM order_totals
3. 마트 (최종 비즈니스 테이블)
models/marts/marketing/dim_customers.sql:
WITH customers AS (
SELECT * FROM {{ ref('stg_customers') }}
),
orders AS (
SELECT * FROM {{ ref('int_order_totals') }}
)
SELECT
customers.customer_id,
customers.first_name,
customers.last_name,
COALESCE(orders.total_orders, 0) AS total_orders,
COALESCE(orders.lifetime_value, 0) AS lifetime_value
FROM customers
LEFT JOIN orders ON customers.customer_id = orders.customer_id
4. 테스트 추가
models/marts/finance/schema.yml:
version: 2
models:
- name: fct_orders
columns:
- name: order_id
tests:
- unique
- not_null
- name: total_amount
tests:
- positive_value
tests:
- relationships:
to: ref('dim_customers')
field: customer_id
사용자 정의 테스트(tests/assert_positive_total.sql):
{% test positive_value(model, column_name) %}
SELECT *
FROM {{ model }}
WHERE {{ column_name }} < 0
{% endtest %}
5. 문서화
프로젝트 루트에서 실행:
dbt docs generate
dbt docs serve
models/marts/finance/fct_orders.yml에 설명을 추가하세요:
version: 2
models:
- name: fct_orders
description: