Data/데이터 엔지니어링

[dbt] Jinja in dbt

빛날희- 2026. 2. 22. 16:22
728x90

Jinja란?

python으로 작성된 템플릿 언어로, dbt에서는 SQL 기능을 향상시키기 위해 사용된다.

Jinja는 SQL 스크립트 내에서 조건부 논리, 루프, 변수 관리를 가능하게 해 dbt 프로젝트에 유연성 및 재사용성을 향상시켜주는 역할을 한다.

따라서 엔지니어는 실시간 조건이나 커스텀 파라미터에 따라 동적으로 SQL을 변경 및 실행할 수 있다.

 


Jinja 기본 문법

* Jinja 사용 팁

1. 실무에선 SQL에 Jinja로직을 너무 많이 넣지 않는 것을 권장 (for. 복잡성 down)

2. 로직이 복잡해질경우 매크로로 분리하여 사용하는 것을 권장

 

구분자

{{...}} : 값 출력. 더블 괄호 내에 포함된 내용은, 실제 값으로 대체되어 사용됨.

SELECT 
    organization_id
FROM 
    {{ ref('dim_users') }} 
    
#위 코드 컴파일 시 아래와 같이 변환

SELECT 
    organization_id
FROM 
    dbt.public.dim_users

 

{{ %...% }} : 제어문 (if, for 등) 등 로직

{% set start_date = "2024-01-01" %} # 변수 정의

# In SQL,
where pickup_date >= '{{ start_date }}'

 

{{# ... # }} : 주석 

{# 이건 실행되지 않는 주석 #}

 


조건문

{% if condition %}
{% elif another_condition %}
{% else %}
{% endif %}

select *
from trips
{% if is_incremental %}
where pickup_date >= '{{ start_date }}'
{% endif %}

반복문

{% for item in items %}
  {{ item }}
{% endfor %}

select *
from trips
where taxi_type in (
  {% for t in taxi_types %}
    '{{ t }}'
    {% if not loop.last %}, # 마지막이 아니면 , 출력
    {% endif %}
  {% endfor %}
)

 

<반복문 내 사용 가능 변수>

반복문 내에선 다음과 같은 변수를 활용할 수 있음.

변수 변수 설명
loop.index 현재 반복 횟수 (1부터 시작) / 순번 매길 때 사용
loop.index0 현재 반복 횟수 (0부터 시작)
loop.revindex 반복의 끝에서부터 현재 위치 (1부터 시작)
loop.revindex0 반복의 끝에서부터 현재 위치 (0부터 시작)
loop.first 첫 번째 반복이면 true
loop.last 마지막 반복이면 true
loop.length 반복 대상 시퀀스의 전체 길이
loop.cycle 전달한 값들을 순서대로 반복해서 반환하는 헬퍼 함수
loop.depth 재귀 반복문에서 현재 깊이 (1부터 시작)
loop.depth0 재귀 반복문에서 현재 깊이 (0부터 시작)
loop.previtem 이전 반복의 아이템 (첫 반복에서는 정의되지 않음)
loop.nextitem 다음 반복의 아이템 (마지막 반복에서는 정의되지 않음)
loop.changed(*val) 이전 호출과 값이 다를 경우 true 반환 / 값 변경 시 구분선 & 조건 삽입 시 사용

 


Macro 정의

# 매크로 정의
{% macro filter_by_date(column, start_date) %}
  {{ column }} >= '{{ start_date }}'
{% endmacro %}

# 매크로 사용
where {{ filter_by_date("pickup_datetime", ds) }}

 


공백 제거 문법

Jinja는 줄바꿈/공백을 그대로 출력하기 때문에 아래 템플릿을 렌더링하면

<div>
    {% if True %}
        yay
    {% endif %}
</div>

 

아래와 같은 결과가 나옴.

<div>

        yay

</div>

 

즉, 공백이 있을 경우 SQL은 돌아가지만, 렌더링 되었을 때 가독성이 안좋을 수 있음.

따라서, 블록 선언시 표현식에 마이너스(-) 부호를 추가하면, 그 블록 앞뒤의 공백을 제거하여 렌더링 할 수 있음.

<div>
    {% if True -%} # -와 %사이에 여백을 추가해선 안됨
        yay
    {%- endif %}
</div>

 

 


참고 자료

https://jinja.palletsprojects.com/en/stable/templates/#

https://medium.com/@huseyin.kesmez/leveraging-jinja-in-dbt-11edded39c5f

 

 

 

728x90