List
지난 글에서는 dbt의 테스트 기능을 통해 데이터 품질을 보장하는 방법을 살펴보았습니다.
이번 글에서는 dbt가 단순 SQL 관리 도구를 넘어 동적 SQL 엔진으로 자리잡을 수 있게 해주는 핵심 요소, Jinja와 매크로에 대해 알아보겠습니다.
데이터 모델링을 하다 보면 같은 쿼리를 반복 작성하거나, 조건에 따라 SQL을 달리 작성해야 하는 경우가 빈번합니다. 이때 Jinja와 매크로를 활용하면 중복을 줄이고, 로직을 재사용하며, 유지보수를 단순화할 수 있습니다.
Jinja란?
Jinja는 파이썬 기반의 템플릿 언어입니다.
dbt는 Jinja를 SQL 안에 삽입하여 동적 SQL을 작성할 수 있도록 지원합니다.
대표적인 문법은 다음과 같습니다:
•
변수 출력: {{ variable }}
•
제어문: {% if ... %} ... {% endif %}
•
반복문: {% for ... %} ... {% endfor %}
매크로 — 반복을 줄이고 재사용하기
dbt에서 매크로는 함수처럼 재사용 가능한 SQL 블록입니다.
macros/ 디렉토리에 정의하고, {{ macro_name() }} 형태로 호출합니다.
간단한 예시
-- macros/percent_to_decimal.sql
{% macro percent_to_decimal(column_name) %}
({{ column_name }} / 100.0)
{% endmacro %}
SQL
복사
-- models/core/orders.sql
select
order_id,
{{ percent_to_decimal('discount_rate') }} as discount_rate_decimal
from {{ ref('stg_orders') }}
SQL
복사
포인트
•
매크로를 쓰면 계산 로직을 한 곳에 정의해두고 여러 모델에서 호출 가능
•
로직이 변경돼도 매크로만 고치면 전체 모델에 반영됨
ref()와 source() — 의존성과 추적성
매크로와 함께 가장 자주 쓰이는 함수는 ref()와 source()입니다.
-- ref: 다른 모델을 참조
select * from {{ ref('customers') }}
-- source: 원천 테이블을 참조
select * from {{ source('raw', 'orders') }}
SQL
복사
•
ref()
◦
모델 간 의존성을 정의 → 빌드 순서를 dbt가 자동으로 계산
◦
변경 시 lineage(계보 추적)도 자동 생성
•
source()
◦
원천 DB 테이블을 선언적으로 정의
◦
스키마 테스트, 문서화, lineage에서 출발점을 명확히 표시
조건부 로직 — 상황에 따라 다른 SQL
환경이나 조건에 따라 SQL을 다르게 작성해야 할 때도 있습니다.
예를 들어, 개발 환경에서는 최근 1일치만 샘플링하고, 운영 환경에서는 전체 데이터를 가져오는 식입니다.
-- models/core/fact_orders.sql
select *
from {{ ref('stg_orders') }}
{% if target.name == 'dev' %}
where order_date >= current_date - interval '1 day'
{% endif %}
SQL
복사
•
target.name: 현재 실행 환경(dev/prod 등)을 인식
•
환경별로 SQL을 분기 처리 가능
dbt_utils 패키지 — 실무형 매크로 모음집
매크로를 직접 작성할 수도 있지만, 이미 커뮤니티에서 만든 표준 매크로 모음집을 활용하는 것이 효율적입니다.
예시:
-- 특정 칼럼이 NULL이 아닌 행 수 카운트
select {{ dbt_utils.count_distinct('customer_id') }} as customers
from {{ ref('orders') }}
SQL
복사
-- 두 테이블 비교
{{ dbt_utils.union_relations(
relations=[ref('orders'), ref('orders_archive')]
) }}
SQL
복사
포인트
•
자주 쓰이는 로직(집계, 비교, 피벗 등)을 재활용
•
매크로 작성 시간을 줄이고, 표준화된 코드를 확보
마무리
이번 글에서는 dbt의 Jinja와 매크로를 활용해 SQL을 더 유연하고 재사용 가능하게 만드는 방법을 다뤘습니다. 핵심은 “SQL을 반복하지 말고, 템플릿화하라”입니다. 매크로를 적극적으로 도입하면 팀 전체의 코드 품질과 생산성이 크게 향상됩니다.
다음 글에서는 이 매크로와 모델을 문서화하고 공유하는 기능, Documentation과 Lineage 추적에 대해 살펴보겠습니다.