Search

dbt (data-build-tool) 기술 정리

dbt를 적용한 데이터마트 작업중 정리한 내용들

dbt란

dbt(data-build-tool)는 데이터 변환(Transform)을 SQL 기반으로 선언적으로 관리하는 도구
SQL 모델을 코드로 버전 관리하고, 모델 간 의존성, 테스트 자동화, 문서 자동 생성등 체계적 관리 가능
Jinja 템플릿 기반 동적 SQL 구성으로 T(Transform) 역할을 담당
왜 필요할까?
SQL 기반의 데이터 흐름이 비정형적으로 계속 증가하면서 의존 관계 파악이 어려워짐
동일한 조인/전처리 로직이 여러 곳에 복붙되며 쿼리 중복과 비효율적인 실행이 매우 많음
BI 환경에서 대규모 SQL이 24시간 끊임없이 돌면서 서버 리소스(메모리·CPU)가 한계치에 근접
태블로 Prep 서버가 EC2 8xlarge임에도 메모리 리밋 근접
SQL 변경이 들어올 때 전체 영향도 파악이 어려워 수정 리스크가 커짐
→ 이런 문제 해결을 위해 점차적으로 dbt로 데이터 변환 파이프라인을 대체할 예정

dbt 기능들

모델
SQL 파일 단위 관리
models/ └─ stg_order.sql └─ fact_order_product.sql └─ dim_product.sql
Plain Text
복사
의존성 관리
SQL 안에서 {{ ref(’model_name’) }} 사용해 해당 모델이 어떤 모델 기반으로 만드는지 자동 추적
select * from {{ ref('stg_order') }}
SQL
복사
문서화
테이블간 lineage, 컬럼 설명, 테스트 결과 등 자동 생성
예시 이미지
데이터 품질 테스트
unique, not_null, accept_value 등 테스트 수행
커스텀 테스트도 작성 가능
columns: - name: order_id tests: - unique - not_null
SQL
복사
Jinja 템플릿
반복문, 조건문, 변수, 매크로 등을 통해 동적 SQL을 생성 가능
select id, {{ dbt_utils.generate_surrogate_key(['email', 'created_at']) }} as user from raw_users
SQL
복사

dbt 리소스

macros/:
재사용 가능한 Jinja 매크로 함수 정의하는 곳
반복적인 쿼리 로직, 동적 SQL 생성 등
seed/: CSV 같은 정적 데이터를 db에 로드할 때 사용
snapshots/:
원본 테이블의 변경 이력을 시간 단위로 저장하는 기능
주로 코드북, 매핑 테이블, 기준 테이블 등에 활용
dbt seed 실행 시 데이터베이스에 로드됨
models/:
실제 SQL 모델 파일들이 위치
dbt run시 실행되어 테이블/뷰로 변환됨
target/:
dbt 실행 결과물이 저장되는 폴더
manifest.json, run_results.json 등이 들어 있음
Airflow, DataHub, Lineage 추적 등에 이 파일 사용
tests/: 스키마 및 데이터 품질 테스트 SQL 또는 YAML 정의 저장소.
analyses/: 운영 모델과 분리된 adhoc SQL 분석 파일 저장 목적
logs/: 실행 시 생성된 로그

Table Materialization 유형

table:
CREATE TABLE AS(CTA) 문을 통해 모델을 테이블로 재생성
쿼리 성능 우수하지만 복잡한 변환의 경우 재생성에 시간 소요
fact 보다 dim 유형의 테이블에 주로 사용
view:
CREATE VIEW 문을 통해 모델을 뷰로 재 생성
추가적인 데이터 저장 없이 항상 최신 데이터 반영
incremental:
이전 실행 이후 변경되거나 추가된 데이터만 삽입/업데이트, unique_key 지정 필요
incremental_strategy
append - 증분해야하는 행들 기존 테이블에 단순 추가
merge - 아테나는 파일기반으로 upsert가 안되서 지원안함
증분해야하는 행들을 기존 테이블과 비교해 특정 컬럼의 값만 업데이트 하는 방식
중복 행 생성을 차단하지만 기존 테이블과 일일히 비교해야해서 속도가 느려짐
insert overwrite
아테나에서 특정 파티션 단위로 수행
기존 파티션을 재적재하기 때문에 중복 없음
{{ config( materialized='incremental', incremental_strategy='insert_overwrite', partition_by=['year', 'month', 'day'] ) }}
SQL
복사
materialized view:
데이터베이스에 물리적으로 저장된 뷰
쿼리 성능 우수 데이터의 최신성을 유지
dbt-athena-adapter는 현재 미지원

profiles.yml 주요 파라미터(아테나 기준)

필드
설명
예시
type
사용 데이터베이스 어댑터
athena, snowflake, bigquery
database
카탈로그 명
awsdatacatalog (Athena 고정)
schema
Glue Database 명 (dbt schema와 동일)
bronze, silver, gold
s3_staging_dir
쿼리 결과 저장용 버킷
s3://data-lake/staging
threads
동시 실행 쓰레드 수
아테나 어댑터는 모델 하나당 쿼리 하나이므로 동시에 돌릴 아테나 쿼리수와 같음 아테나는 기본 계정당 20개의 쿼리 동시 실행 가능
region_name
AWS 리전
ap-northeast-2

dbt 주요 명령어 정리

명령어
역할
설명
dbt run
모델 실행
모델 SQL → 테이블/뷰 생성
dbt build
전체 실행
run + test + snapshot + seed 일괄 수행 (권장)
dbt parse
구문 검증
Jinja 파싱만 수행, DB 쿼리 실행 없음
dbt compile
SQL 렌더링
변환된 실제 SQL을 /target/compiled/에 저장
dbt test
품질 테스트
unique, not_null, relationships 등 실행
dbt seed
CSV 로드
seeds/의 csv 로드
dbt snapshot
변경 이력 저장
snapshot 정의 기반으로 SCD2(Slowly Changing Dimension) 테이블 생성
dbt clean
캐시 삭제
target/, dbt_packages/ 삭제
dbt deps
패키지 설치
packages.yml 기반 외부 패키지 다운로드
dbt run-operation
매크로 단독 실행
ETL 관리용 커스텀 작업에 사용
dbt docs generate
문서 생성
manifest, catalog 생성
dbt docs serve
문서 UI 실행
로컬 웹 lineage UI 제공
dbt debug
환경 검사
프로필, credential, DB 연결 체크