
스노우플레이크 데이터 웨어하우스를 구축을 했다면 dbt와 연동을 시켜 데이터 변환하는 작업을 수행하였다. dbt는 데이터 가공에 있어 transformation에 집중되어있다. 나눈 스노우플레이크 내에서 데이터를 처리하는 방법을 사용하였다. Raw 데이터를 올린 이후에 쿼리로 변경하거나 테이블 생성시 Snowsight UI에서 직접 변경하는 방법도 있다. 하지만 SQL 기반으로 데이터를 처리하는 것의 안 좋은 점은 코드로 관리가 안된다는 것이다. 쿼리로 진행시 ad-hoc 한 쿼리가 많이 생기고 나중에 재사용할 때 다시 작성하는 경우도 있고 쿼리를 수정해도 버전 관리 문제로 쿼리의 히스토리도 파악하기 어려워진다. 또한, 성능이나 안정성을 고려해서 SQL 을 작성하다보니 가독성이 떨어지고 유지보수 또한 어려워지는 상황이 발생한다. 그래서 이러한 쿼리들을 통합하고 정형화하는 방법을 사용해보고자 dbt 사용을 하게 되었다. dbt를 사용하면 SQL 쿼리 코드 관리, 코드 재사용 용이, 또한 많은 데이터가 저장되면 누가 어떤 걸 만들었고, 어떻게 관리되고 있는지 모니터링이 안되기에 오너쉽 관리를 통한 히스토리 추적이 가능하다.
특징
- DBT는 ELT의 T(Transform)를 담당한다.
- 코드 재사용이 가능하다. DBT는 데이터 모델이라는 것을 통해 결과물을 정의하면서 여러 패키지들을 재사용한다.
- 연동하는 과정에는 CLI 와 dbt Cloud 두 가지 방법이 있다.
- Git을 통해 버전관리가 가능하고 팀에서 협력하여 작업을 할 수 있다.
- select문을 작성함으로써 모듈화된 SQL 모델을 만들 수 있다. dbt에서는 이러한 select문을 table, view로 변환해서 만들어주는 역할을 한다.
- 데이터 계보를 통해 데이터의 흐름을 시각화하여, 데이터 버전관리 및 의존성 파악 문제를 해결한다.
- 사용자는 SQL만 알아도 쉽게 이용할 수 있고, yaml 파일만 이용하면 어떤 테이블이든 테스트, 문서화등의 작업을 쉽게 할 수 있다.
✅ 갑자기 뜬금없이 단어 설명이 나와서 의문일 수 있다. 입력 데이터(테이블)들을 연결해서 새로운 데이터(테이블)를 생성하는 것. 여기서 transformation 이나 clean-up 을 수행한다. SQL 모델을 물리적으로 저장하는 방식을 의미하며 총 4가지의 방식이 있다.
데이터를 잘 사용하지 않는 경우, 모델 결과를 DB의 테이블에 저장
{{
config(
materialized='table',
sort='timestamp',
dist='user_id')
}}
select *
from ...
--- target directory log
-- target/run/{project_name}/models/{schema}/{model_name}.sql
create or replace transient table {table_name} as (
...
)
데이터를 반복해서 자주 사용하는 경우
{{
config(
materialized='view',
indexes=[{'columns': ['col_a'], 'cluster': 'cluster_a'}]) }}
indexes=[{'columns': ['symbol']}])
}}
select ...
Fact 테이블, 과거 레코드를 수정할 필요가 없는 경우
{{ config( materialized='incremental', unique_key='date_day', incremental_strategy='delete+insert', ... ) }} select ... -- target directory 로그 -- target/run/{project_name}/models/{schema}/{model_name}.sql insert into {table_name} as (...) (...)
한 SELECT에서 자주 사용되는 데이터를 모듈화 하는데 사용

1. 스테이징 모델
- 목적 : 원본 데이터를 가장 가까운 형태로 반영하며, 복잡한 변환을 최소화한다. 주로 데이터 타입 변경, 컬럼 이름 변경, 기본 계산 등 간단한 변환만 적용한다.
- 특징 : 일반적으로 뷰 형태로 물리화(materialize)되며, 다른 계층의 모델이 참조할 수 있도록 최신 데이터에 대한 접근을 제공한다.
2. 마트 모델
- 목적 : 최종적으로 비즈니스 정의 엔터티를 구성하여 최종 사용자가 대시보드나 앱을 통해 접근할 수 있도록 한다.
- 특징 : 성능이 중요하므로 주로 테이블 형태로 물리화되며, 필요에 따라 incremental model로 설정될 수 있다. 모델 설계시 너무 많은 조인을 피하고, 필요하다면 중간 계층에서 디자인을 재검토해야 한다.
3. View vs Table
- ✅ 스테이징 모델에서는 데이터를 신속하게 반영하고 최신 상태를 유지할 필요가 있기 때문에 주로 뷰로, 마트 모델에서는 데이터의 접근 속도를 빠르게 하고 시스템 부하를 최소하하는 것이 중요하므로 테이블로 한다.
- View
- 장점 : 저장 공간 절약(실제 데이터 저장 x), 데이터 일관성(기반 데이터가 변경될 때 뷰를 통해 조회하는 데이터도 실시간으로 갱신되어, 항상 최신 데이터를 유지)
- 단점 : 성능 저하(매번 쿼리를 실행, 대용량 데이터 처리시 성능 저하)
- Table
- 장점 : 성능 향상(데이터를 사전에 계산하여 저장하기에, 조회 시 빠른 응답 속도), 부하 감소(빈번한 쿼리 실행으로 인한 DB 부하 감소)
- 단점 : 저장 공간 사용, 데이터 갱신 지연(기반 데이터가 변경되어도 테이블은 자동으로 갱신x, 정기적인 갱신이 필요함)
dbt Models : Input
- 입력(raw)과 중간(staging,src) 데이터 정의
- raw는 CTE로 정의
- staging은 View로 정의
dbt Models : Output
- 최종(core) 데이터 정의
- core는 table로 정의
결론적으로 모든 models폴더 밑에 sql파일로 존재한다.
- 기본적으로 SELECT + Jinja 템플릿과 매트로
- 다른 테이블들을 사용 가능(reference) -> 이를 통해 linage파악






✅ DBT를 편리하게 사용하기 위해서 웹 IDE를 제공해주는 서비스이다. DBT CLI를 통해 할 수 있는 모든 기능을 할 수가 있고 job 기능을 이용해서 ingestion 파이프 라인 구축이 가능하다.

✅ 파이썬 패키지로 DBT설치. DBT에서 제공하는 모든 기능을 사용할 수 있지만, 실제 production 운영을 하기 위해선 수동으로 모든 세팅을 해주어야하는 단점이 있다. 무료이긴 하나 아주 복잡한 과정을 거치기에 중간에 포기함..
SELECT
seller_id AS user_id,
price,
created_at,
IF(code = 10, True, False) AS is_something,
...
TIMESTAMP('{{ var("target_date") }}') AS update_scheduled_at,
CURRENT_TIMESTAMP() AS last_updated_at
FROM {{ ref('db_sample_table') }} AS sample_table --reference
LEFT JOIN {{ ref('db_another_table') } AS another_table --reference
ON sample_table.id = another_table.category_id
WHERE {{ db_partition_filter_by('created_at') }} -- macro
AND type = 'Sample Type'
AND code IN (10, 20, 30, 55)
AND user_id IS NOT NULL;
https://velog.io/@juliy9812/dbt-%EA%B0%9C%EB%85%90
https://www.youtube.com/watch?v=m9lGtlxRJC4&ab_channel=%EB%8D%B0%EC%9D%B4%ED%84%B0%EC%95%BC%EB%86%80%EC%9E%90
https://www.getdbt.com/blog/modular-data-modeling-techniques