Back to Blog
dbtELTData TransformationSQLData Engineering

0x01. dbt 개요 - SQL만으로 데이터 변환을 코드처럼 관리하는 법

SELECT만 쓰면 dbt가 알아서 테이블을 만든다. ELT의 T를 담당하는 dbt의 철학과 핵심 원칙을 정리한다.

dbt Logo

dbt란

dbt(Data Build Tool)는 ELT 파이프라인에서 T(Transform)를 담당하는 오픈소스 프레임워크이다. SQL SELECT 문만 작성하면, dbt가 이를 웨어하우스 안에서 테이블이나 뷰로 변환한다. DDL(CREATE TABLE)이나 DML(INSERT INTO)을 직접 작성할 필요가 없다.

전통적인 ETL에서는 변환 로직이 Airflow, Informatica 같은 파이프라인 도구 곳곳에 흩어져 있었다. 테스트도 없고, 문서화도 안 되고, 버전 관리도 어려웠다. dbt는 이 변환 계층만 분리하여 소프트웨어 엔지니어링 관행 — 버전 관리, 테스트, 코드 리뷰, 자동 문서화 — 을 데이터 변환에 적용한다.

ELT에서의 위치

dbt ELT Position
Modern Data Stack Architecture

dbt는 데이터를 추출하거나 적재하지 않는다. Fivetran, Airbyte 같은 도구가 소스 시스템에서 웨어하우스로 데이터를 옮기면(Extract + Load), dbt가 웨어하우스 내부에서 변환을 수행한다. 별도 ETL 서버가 필요 없고, 웨어하우스의 컴퓨팅 파워를 직접 활용한다.

핵심 원칙

SQL as Code — 변환 로직을 SQL 파일로 관리한다. Git으로 버전 관리하고, PR 리뷰로 품질을 보장한다.

Modularity — 복잡한 변환을 작은 모델 단위로 쪼갠다. 모델 간 의존성은 ref() 함수로 선언하면 실행 순서를 자동으로 결정한다.

Test & Document — 모든 모델에 테스트를 붙이고, 설명을 추가하면 자동으로 데이터 카탈로그가 생성된다.

모델 — dbt의 기본 단위

dbt의 기본 단위는 모델(Model)이다. 하나의 SQL 파일이 하나의 모델이고, 파일명이 곧 모델명이 된다.

-- models/staging/stg_orders.sql
SELECT
    id AS order_id,
    user_id,
    order_date,
    status,
    amount
FROM {{ source('jaffle_shop', 'orders') }}
WHERE status != 'deleted'

SELECT만 작성하면 dbt가 CREATE TABLE 또는 CREATE VIEW를 알아서 생성한다. {{ source() }}로 원본 테이블을, {{ ref() }}로 다른 모델을 참조한다.

ref() — 모델 간 의존성 선언

-- models/marts/fct_orders.sql
SELECT
    o.order_id,
    o.order_date,
    c.customer_name,
    o.amount
FROM {{ ref('stg_orders') }} o
JOIN {{ ref('stg_customers') }} c ON o.user_id = c.customer_id

ref()는 dbt의 핵심 함수이다. 이 함수 하나로 세 가지를 해결한다:

  • 모델 간 의존성을 자동 파악하여 실행 순서 결정
  • 환경(dev/prod)에 따라 스키마를 자동 전환
  • 리니지 그래프를 자동 생성

dbt Core vs dbt Cloud

구분dbt Coredbt Cloud
비용오픈소스(무료)유료 SaaS
실행CLI (로컬/서버)웹 IDE + 스케줄러
오케스트레이션외부 도구 필요 (Airflow 등)내장 스케줄러 + CI/CD
Semantic Layer없음MetricFlow 내장

둘은 동일한 변환 엔진을 사용한다. 차이는 인프라 관리 방식이다. 소규모 팀은 dbt Core로 시작하고, 규모가 커지면 Cloud로 마이그레이션하는 패턴이 일반적이다.

시리즈 안내

이 시리즈에서는 dbt의 핵심 개념을 깊이 있게 다룬다:

  1. 개요 — dbt의 철학과 ELT에서의 위치 (이 글)
  2. Models & Materialization — View, Table, Incremental, Ephemeral 전략
  3. Tests & Sources — 데이터 품질 테스트와 소스 관리
  4. Jinja & Macros — 템플릿 엔진으로 SQL에 프로그래밍 추가
  5. 프로젝트 구조 & Snapshots — 3계층 컨벤션과 변경 이력 추적