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
'Data > 데이터 엔지니어링' 카테고리의 다른 글
| star schema VS snowflake schema (0) | 2026.02.23 |
|---|---|
| [dbt] dbt는 무엇이고, 언제 활용될까? (0) | 2026.02.17 |
| OLAP & Data Warehouse (0) | 2026.02.08 |
| [BigQuery] BigQuery With Partitioning & Clustering (0) | 2026.02.08 |
| ELT vs ETL 언제 사용하면 좋을까? (0) | 2026.02.02 |