Search
moon
sun

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 연결 체크