dbt 2026 ์™„๋ฒฝ ๊ฐ€์ด๋“œ: ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜, ํ…Œ์ŠคํŠธ ์ „๋žต, ๋ฉด์ ‘ ์งˆ๋ฌธ ์ด์ •๋ฆฌ

dbt๋ฅผ ํ™œ์šฉํ•œ ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜์˜ ํ•ต์‹ฌ ๊ฐœ๋…๋ถ€ํ„ฐ ์‹ค๋ฌด๊นŒ์ง€, ๋ ˆ์ด์–ด๋“œ ๋ชจ๋ธ๋ง, ์ธํฌ๋ฆฌ๋ฉ˜ํƒˆ ์ „๋žต, ํ…Œ์ŠคํŠธ ๋ฐฉ๋ฒ•๋ก , ๊ทธ๋ฆฌ๊ณ  2026๋…„ ๋ฐ์ดํ„ฐ ์—”์ง€๋‹ˆ์–ด๋ง ๋ฉด์ ‘์—์„œ ์ž์ฃผ ์ถœ์ œ๋˜๋Š” ์งˆ๋ฌธ์„ ์ฝ”๋“œ ์˜ˆ์ œ์™€ ํ•จ๊ป˜ ์ƒ์„ธํžˆ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

dbt data transformations and testing tutorial 2026

dbt(data build tool)๋Š” ๋ชจ๋˜ ๋ฐ์ดํ„ฐ ์›จ์–ดํ•˜์šฐ์Šค ๋‚ด์—์„œ ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ‘œ์ค€ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ์ž๋ฆฌ ์žก์•˜์œผ๋ฉฐ, 2026๋…„ ํ˜„์žฌ 40,000๊ฐœ ์ด์ƒ์˜ ๊ธฐ์—…์ด ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํŠœํ† ๋ฆฌ์–ผ์—์„œ๋Š” dbt ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜์˜ ํ•ต์‹ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜, ํ…Œ์ŠคํŠธ ์ „๋žต, ๊ทธ๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ ์—”์ง€๋‹ˆ์–ด๋ง ๋ฉด์ ‘์—์„œ ์‹ค์ œ๋กœ ์ถœ์ œ๋˜๋Š” ์งˆ๋ฌธ๋“ค์„ ์ฝ”๋“œ ์˜ˆ์ œ์™€ ํ•จ๊ป˜ ์‚ดํŽด๋ด…๋‹ˆ๋‹ค.

dbt์˜ ์—ญํ• 

dbt๋Š” ELT์—์„œ T(Transform)๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. SQL SELECT ๋ฌธ์„ DDL(CREATE TABLE, CREATE VIEW, MERGE)๋กœ ์ปดํŒŒ์ผํ•˜์—ฌ Snowflake, BigQuery, Redshift, Databricks ๋“ฑ์˜ ์›จ์–ดํ•˜์šฐ์Šค์—์„œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋ฒ„์ „ ๊ด€๋ฆฌ, ์˜์กด์„ฑ ํ•ด๊ฒฐ, ํ…Œ์ŠคํŠธ, ๋ฌธ์„œํ™” ๊ธฐ๋Šฅ์ด ๊ธฐ๋ณธ์œผ๋กœ ๋‚ด์žฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋ ˆ์ด์–ด๋“œ ๋ชจ๋ธ๋ง: Staging, Intermediate, Marts

์ž˜ ๊ตฌ์กฐํ™”๋œ dbt ํ”„๋กœ์ ํŠธ๋Š” ๋ณ€ํ™˜ ์ฒ˜๋ฆฌ๋ฅผ ์„ธ ๊ฐœ์˜ ๋ ˆ์ด์–ด๋กœ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค. dbt ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ๋„๋ฆฌ ์ฑ„ํƒ๋œ ์ด ์ ‘๊ทผ๋ฒ•์€ ๊ฐ ๋ชจ๋ธ์˜ ๋‹จ์ผ ์ฑ…์ž„์„ ๋ณด์žฅํ•˜๊ณ  ๋””๋ฒ„๊น…์„ ์šฉ์ดํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

Staging ๋ชจ๋ธ์€ ์›์‹œ ๋ฐ์ดํ„ฐ์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋ ˆ์ด์–ด์— ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค. ์ปฌ๋Ÿผ๋ช… ๋ณ€๊ฒฝ, ํƒ€์ž… ์บ์ŠคํŒ…, ๋ถˆํ•„์š”ํ•œ ํ–‰ ํ•„ํ„ฐ๋ง์ด ์ฃผ๋œ ์—ญํ• ์ด๋ฉฐ, ์กฐ์ธ์ด๋‚˜ ์ง‘๊ณ„๋Š” ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

sql
-- models/staging/stg_orders.sql
WITH source AS (
    SELECT * FROM {{ source('ecommerce', 'raw_orders') }}
)
SELECT
    id AS order_id,
    customer_id,
    CAST(order_date AS DATE) AS order_date,
    CAST(amount AS DECIMAL(10, 2)) AS order_amount,
    LOWER(status) AS order_status
FROM source
WHERE id IS NOT NULL

Intermediate ๋ชจ๋ธ์€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ ์šฉํ•˜๋Š” ๋ ˆ์ด์–ด์ž…๋‹ˆ๋‹ค. ์กฐ์ธ, ์ง‘๊ณ„, ์œˆ๋„์šฐ ํ•จ์ˆ˜ ๋“ฑ์„ ํ™œ์šฉํ•˜๋ฉฐ, ref()๋ฅผ ํ†ตํ•ด Staging ๋ชจ๋ธ์„ ์ฐธ์กฐํ•จ์œผ๋กœ์จ DAG์— ์˜์กด์„ฑ์„ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.

sql
-- models/intermediate/int_customer_orders.sql
WITH orders AS (
    SELECT * FROM {{ ref('stg_orders') }}
),
customers AS (
    SELECT * FROM {{ ref('stg_customers') }}
)
SELECT
    c.customer_id,
    c.customer_name,
    COUNT(o.order_id) AS total_orders,
    SUM(o.order_amount) AS lifetime_value,
    MIN(o.order_date) AS first_order_date,
    MAX(o.order_date) AS last_order_date
FROM customers c
LEFT JOIN orders o ON c.customer_id = o.customer_id
GROUP BY c.customer_id, c.customer_name

Marts๋Š” ์ตœ์ข… ์†Œ๋น„ ๋ ˆ์ด์–ด๋กœ, ๋Œ€์‹œ๋ณด๋“œ์™€ ๋ถ„์„๊ฐ€๊ฐ€ ์ง์ ‘ ์ฟผ๋ฆฌํ•˜๋Š” ์ •๋ฆฌ๋˜๊ณ  ๋ฌธ์„œํ™”๋œ ํ…Œ์ด๋ธ”์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ ˆ์ด์–ด ๊ตฌ์กฐ ๋•๋ถ„์— ์†Œ์Šค์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•ด๋„ Staging ๋ ˆ์ด์–ด์—๋งŒ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋ฉฐ, ์ „์ฒด ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ ํ™•์‚ฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ ๋ ˆ์ด์–ด๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ref() ํ•จ์ˆ˜์™€ DAG ์˜์กด์„ฑ ํ•ด๊ฒฐ

ref()๋Š” ๋‹จ์ˆœํ•œ ๋ณ„์นญ์ด ์•„๋‹™๋‹ˆ๋‹ค. {{ ref('stg_orders') }}๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ปดํŒŒ์ผ ์‹œ์ ์— ์ •๊ทœํ™”๋œ ํ…Œ์ด๋ธ”๋ช…์ด ํ•ด๊ฒฐ๋จ๊ณผ ๋™์‹œ์—, dbt์˜ DAG(๋ฐฉํ–ฅ ๋น„์ˆœํ™˜ ๊ทธ๋ž˜ํ”„)์— ์˜์กด์„ฑ ์—ฃ์ง€๊ฐ€ ๋“ฑ๋ก๋ฉ๋‹ˆ๋‹ค. ref()๊ฐ€ ์—†์œผ๋ฉด dbt๋Š” ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ํ”ํžˆ ์ €์ง€๋ฅด๋Š” ์‹ค์ˆ˜๋Š” ref() ๋Œ€์‹  ํ…Œ์ด๋ธ”๋ช…์„ ์ง์ ‘ ํ•˜๋“œ์ฝ”๋”ฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์˜์กด์„ฑ ์ถ”์ ์„ ๊นจ๋œจ๋ฆฌ๊ณ , ์ƒ์œ„ ์˜์กด ๋ชจ๋ธ์ด ์ค€๋น„๋˜๊ธฐ ์ „์— ํ•˜์œ„ ๋ชจ๋ธ์ด ์‹คํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

sql
-- ์ž˜๋ชป๋œ ์˜ˆ: ํ•˜๋“œ์ฝ”๋”ฉ๋œ ์ฐธ์กฐ, ์˜์กด์„ฑ ์ถ”์  ๋ถˆ๊ฐ€
SELECT * FROM analytics.stg_orders

-- ์˜ฌ๋ฐ”๋ฅธ ์˜ˆ: ref()๋กœ ์˜์กด์„ฑ ๋“ฑ๋ก
SELECT * FROM {{ ref('stg_orders') }}

DAG๋Š” dbt run --select stg_orders+์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ๋„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ์ง€์ •๋œ ๋ชจ๋ธ๊ณผ ๊ทธ ํ•˜์œ„์˜ ๋ชจ๋“  ๋ชจ๋ธ์„ ์‹คํ–‰ํ•˜๋ฉฐ, ์†Œ์Šค ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ ํ›„ ๋Œ€์ƒ์„ ์ง€์ •ํ•œ ์žฌ๋นŒ๋“œ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋งคํ„ฐ๋ฆฌ์–ผ๋ผ์ด์ œ์ด์…˜: ์ ํ•ฉํ•œ ์Šคํ† ๋ฆฌ์ง€ ์ „๋žต ์„ ํƒ

dbt๋Š” ๋„ค ๊ฐ€์ง€ ๊ธฐ๋ณธ ๋งคํ„ฐ๋ฆฌ์–ผ๋ผ์ด์ œ์ด์…˜์„ ์ œ๊ณตํ•˜๋ฉฐ, ์ ‘๊ทผ ํŒจํ„ด๊ณผ ๋ฐ์ดํ„ฐ ๊ทœ๋ชจ์— ๋”ฐ๋ผ ์ ์ ˆํžˆ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋งคํ„ฐ๋ฆฌ์–ผ๋ผ์ด์ œ์ด์…˜์Šคํ† ๋ฆฌ์ง€์ ํ•ฉํ•œ ์šฉ๋„ํŠธ๋ ˆ์ด๋“œ์˜คํ”„
view์Šคํ† ๋ฆฌ์ง€ ์—†์Œ(์ฝ๊ธฐ ์‹œ ์—ฐ์‚ฐ)๊ฐ€๋ฒผ์šด ๋ณ€ํ™˜, ์†Œ๊ทœ๋ชจ ๋ฐ์ดํ„ฐ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ์—์„œ ์ฝ๊ธฐ ์†๋„ ์ €ํ•˜
table๋งค ์‹คํ–‰๋งˆ๋‹ค ์ „์ฒด ํ…Œ์ด๋ธ” ์žฌ๊ตฌ์ถ•Mart ๋ ˆ์ด์–ด, ๋น ๋ฅธ ์ฝ๊ธฐ์ „์ฒด ์žฌ๊ตฌ์ถ•, ๋†’์€ ๋น„์šฉ
incremental์‹ ๊ทœ ํ–‰๋งŒ ์ถ”๊ฐ€/๋ณ‘ํ•ฉ๋Œ€๊ทœ๋ชจ ํŒฉํŠธ ํ…Œ์ด๋ธ”, ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆผ๋ณต์žกํ•œ ๋กœ์ง, unique_key ํ•„์š”
ephemeralCTE๋กœ ์ธ๋ผ์ธํ™”, ์‹ค์ฒดํ™”ํ•˜์ง€ ์•Š์Œ๋ชจ๋ธ ๊ฐ„ ๊ณต์œ ๋˜๋Š” ์žฌ์‚ฌ์šฉ ๋กœ์ง์ง์ ‘ ์ฟผ๋ฆฌ ๋ถˆ๊ฐ€

๊ธฐ๋ณธ๊ฐ’์€ view์ž…๋‹ˆ๋‹ค. ๋ชจ๋ธ์˜ config ๋ธ”๋ก ๋˜๋Š” dbt_project.yml์—์„œ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

sql
-- models/marts/fct_daily_revenue.sql
{{
    config(
        materialized='incremental',
        unique_key='revenue_date',
        incremental_strategy='merge'
    )
}}
SELECT
    DATE(order_date) AS revenue_date,
    SUM(order_amount) AS daily_revenue,
    COUNT(DISTINCT customer_id) AS unique_customers
FROM {{ ref('stg_orders') }}
WHERE order_status = 'completed'
{% if is_incremental() %}
    AND order_date > (SELECT MAX(revenue_date) FROM {{ this }})
{% endif %}
GROUP BY DATE(order_date)

is_incremental() ๋ธ”๋ก์€ ์ธํฌ๋ฆฌ๋ฉ˜ํƒˆ ๋นŒ๋“œ ์‹œ์—๋งŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ „์ฒด ๋ฆฌํ”„๋ ˆ์‹œ(dbt run --full-refresh) ์‹œ์—๋Š” ๊ฑด๋„ˆ๋›ฐ์–ด์ง€๊ณ  ํ…Œ์ด๋ธ” ์ „์ฒด๊ฐ€ ์žฌ๊ตฌ์ถ•๋ฉ๋‹ˆ๋‹ค.

Data Engineering ๋ฉด์ ‘ ์ค€๋น„๊ฐ€ ๋˜์…จ๋‚˜์š”?

์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ, flashcards, ๊ธฐ์ˆ  ํ…Œ์ŠคํŠธ๋กœ ์—ฐ์Šตํ•˜์„ธ์š”.

๊ฐ ๋ ˆ์ด์–ด๋ณ„ ๋ฐ์ดํ„ฐ ํ’ˆ์งˆ ํ…Œ์ŠคํŠธ

dbt๋Š” ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์˜ ํ…Œ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. YAML์—์„œ ์„ ์–ธํ•˜๋Š” ์ œ๋„ค๋ฆญ ํ…Œ์ŠคํŠธ์™€, ์‹คํŒจ ์‹œ ํ–‰์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋…๋ฆฝ SQL ํŒŒ์ผ๋กœ ์ž‘์„ฑํ•˜๋Š” ์‹ฑ๊ทค๋Ÿฌ ํ…Œ์ŠคํŠธ์ž…๋‹ˆ๋‹ค.

์ œ๋„ค๋ฆญ ํ…Œ์ŠคํŠธ๋Š” ๊ตฌ์กฐ์  ์ œ์•ฝ ์กฐ๊ฑด์„ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.

yaml
# models/staging/_stg_models.yml
version: 2

models:
  - name: stg_orders
    columns:
      - name: order_id
        tests:
          - unique           # ์ฃผ๋ฌธ ID ์ค‘๋ณต ์—†์Œ
          - not_null         # ๋ชจ๋“  ํ–‰์— ์ฃผ๋ฌธ ID ์กด์žฌ
      - name: order_status
        tests:
          - accepted_values:
              values: ['completed', 'pending', 'cancelled', 'refunded']
      - name: customer_id
        tests:
          - not_null
          - relationships:   # ์ฐธ์กฐ ๋ฌด๊ฒฐ์„ฑ ๊ฒ€์‚ฌ
              to: ref('stg_customers')
              field: customer_id

์‹ฑ๊ทค๋Ÿฌ ํ…Œ์ŠคํŠธ๋Š” ์ œ๋„ค๋ฆญ ํ…Œ์ŠคํŠธ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์—†๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์„ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.

sql
-- tests/assert_revenue_never_negative.sql
-- ์ผ์ผ ์ˆ˜์ต์ด ์Œ์ˆ˜์ธ ํ–‰์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค(0ํ–‰์ด ๊ธฐ๋Œ€๊ฐ’)
SELECT
    revenue_date,
    daily_revenue
FROM {{ ref('fct_daily_revenue') }}
WHERE daily_revenue < 0

์œ ๋‹› ํ…Œ์ŠคํŠธ๋Š” dbt 1.8์—์„œ ๋„์ž…๋œ ๊ธฐ๋Šฅ์œผ๋กœ, ํ†ต์ œ๋œ ์ž…๋ ฅ๊ณผ ๊ธฐ๋Œ€ ์ถœ๋ ฅ์œผ๋กœ ๋ณ€ํ™˜ ๋กœ์ง์„ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค. ์›จ์–ดํ•˜์šฐ์Šค ์—ฐ๊ฒฐ์ด ํ•„์š” ์—†์œผ๋ฉฐ dbt ํ…Œ์ŠคํŠธ ๋‹จ๊ณ„์—์„œ ์ง์ ‘ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ ์ „๋žต์€ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ๋”ฐ๋ผ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์†Œ์Šค ๋ ˆ๋ฒจ์˜ ์‹ ์„ ๋„ ๊ฒ€์‚ฌ์™€ ํ–‰ ์ˆ˜ ๊ฒ€์ฆ, Staging ๋ ˆ๋ฒจ์˜ ์Šคํ‚ค๋งˆ ํ…Œ์ŠคํŠธ(not_null, unique), Intermediate ๋ ˆ๋ฒจ์˜ ์ฐธ์กฐ ๋ฌด๊ฒฐ์„ฑ, Mart ๋ ˆ๋ฒจ์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์–ด์„œ์…˜ ์ˆœ์„œ๋กœ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค.

dbt Core v1.10๊ณผ Fusion ์—”์ง„

dbt Core v1.10์—์„œ๋Š” run ๋ฐ build ๋ช…๋ น์— --sample ํ”Œ๋ž˜๊ทธ๊ฐ€ ๋„์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ํ”Œ๋ž˜๊ทธ๋Š” ref()์™€ source()์— ์‹œ๊ฐ„ ๊ธฐ๋ฐ˜ ์ƒ˜ํ”Œ๋ง์„ ์ ์šฉํ•˜์—ฌ, ์ „์ฒด ๋นŒ๋“œ ๋น„์šฉ ์—†์ด ๋ฐ์ดํ„ฐ์˜ ์ผ๋ถ€๋ถ„์œผ๋กœ ๋ณ€ํ™˜์„ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜์‹ญ์–ต ํ–‰์˜ ํŒฉํŠธ ํ…Œ์ด๋ธ”์„ ๋‹ค๋ฃจ๋Š” ๋ชจ๋ธ์˜ ๊ฐœ๋ฐœ ๋ฐ˜๋ณต ์ž‘์—…์— ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

dbt Fusion ์—”์ง„์€ Rust๋กœ ์ฒ˜์Œ๋ถ€ํ„ฐ ์žฌ๊ตฌ์ถ•๋œ ์—”์ง„์œผ๋กœ, dbt Cloud์˜ Snowflake, BigQuery, Redshift, Databricks ํ™˜๊ฒฝ์—์„œ ์‹ ๊ทœ ํ”„๋กœ์ ํŠธ์˜ ๊ธฐ๋ณธ ์—”์ง„์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Fusion์€ ์‹œ๋งจํ‹ฑ ๋ฒ„์ €๋‹(2.0๋ถ€ํ„ฐ ์‹œ์ž‘)์„ ๋„์ž…ํ•˜๊ณ , ์ปดํŒŒ์ผ๊ณผ ์‹คํ–‰ ์–‘์ชฝ์—์„œ ์„ฑ๋Šฅ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œ์ผฐ์Šต๋‹ˆ๋‹ค.

2026๋…„์˜ ๊ธฐํƒ€ ์ฃผ๋ชฉํ•  ๋งŒํ•œ ์—…๋ฐ์ดํŠธ๋กœ๋Š” ์ค‘์•™ ์ง‘์ค‘์‹ ๋ฉ”ํŠธ๋ฆญ ์ •์˜๋ฅผ ์œ„ํ•œ Semantic Layer YAML ๋ช…์„ธ, ๋ชจ๋ธ๋ณ„ ์›จ์–ดํ•˜์šฐ์Šค ์ปดํ“จํŒ… ๋น„์šฉ์„ ์ถ”์ •ํ•˜๋Š” Cost Insights(๋ฒ ํƒ€), ๊ทธ๋ฆฌ๊ณ  ์ •์‹ ์ถœ์‹œ๋œ ๋„ค์ดํ‹ฐ๋ธŒ ํ”„๋ผ์ด๋น— ํŒจํ‚ค์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งคํฌ๋กœ์™€ Jinja๋ฅผ ํ™œ์šฉํ•œ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋กœ์ง

๋™์ผํ•œ SQL ํŒจํ„ด์ด ์—ฌ๋Ÿฌ ๋ชจ๋ธ์—์„œ ๋ฐ˜๋ณต๋  ๊ฒฝ์šฐ, ๋งคํฌ๋กœ๋กœ ์ถ”์ถœํ•˜๋Š” ๊ฒƒ์ด ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค. ๋งคํฌ๋กœ๋Š” macros/ ๋””๋ ‰ํ† ๋ฆฌ์— ์ €์žฅ๋˜๋Š” Jinja ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

sql
-- macros/cents_to_dollars.sql
{% macro cents_to_dollars(column_name) %}
    ROUND(CAST({{ column_name }} AS DECIMAL(10, 4)) / 100, 2)
{% endmacro %}

๋ชจ๋“  ๋ชจ๋ธ์—์„œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

sql
-- models/staging/stg_payments.sql
SELECT
    payment_id,
    order_id,
    {{ cents_to_dollars('amount_cents') }} AS amount_dollars,
    payment_method
FROM {{ source('stripe', 'payments') }}

์ด๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ DRY ์›์น™์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณ€ํ™˜ ๊ณต์‹์„ ํ•„์š”ํ•œ ๋ชจ๋“  ๋ชจ๋ธ์— ๋ณต์‚ฌํ•˜๋Š” ๋Œ€์•ˆ์€ ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ ์ฆ๊ฐ€์™€ ๋ถˆ์ผ์น˜์˜ ์›์ธ์ด ๋ฉ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ์—”์ง€๋‹ˆ์–ด๋ง ๋ฉด์ ‘์—์„œ ์‹ค์ œ๋กœ ์ถœ์ œ๋˜๋Š” ์งˆ๋ฌธ

2026๋…„ ๋ฐ์ดํ„ฐ ์—”์ง€๋‹ˆ์–ด๋ง ๋ฉด์ ‘์—์„œ๋Š” ๊ธฐ์ดˆ ์ง€์‹์„ ๋„˜์–ด์„  dbt ์ดํ•ด๋„๋ฅผ ํ‰๊ฐ€ํ•˜๋Š” ์ถ”์„ธ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๋ชจ๋˜ ๋ฐ์ดํ„ฐ ์Šคํƒ์„ ํ™œ์šฉํ•˜๋Š” ๊ธฐ์—…์˜ ์ฑ„์šฉ ํŒจํ„ด์—์„œ ์ถ”์ถœํ•œ, ์ง€์›์ž๋ฅผ ์ฐจ๋ณ„ํ™”ํ•˜๋Š” ํ•ต์‹ฌ ์งˆ๋ฌธ๋“ค์ž…๋‹ˆ๋‹ค.

Q: ์ธํฌ๋ฆฌ๋ฉ˜ํƒˆ ๋ชจ๋ธ์ด ์•ผ๊ฐ„์— ์ „์ฒด ํ…Œ์ด๋ธ”์„ ์žฌ์ฒ˜๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์›์ธ์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

๊ฐ€์žฅ ํ”ํ•œ ์›์ธ์€ unique_key ์ปฌ๋Ÿผ์— NULL ๊ฐ’์ด ํฌํ•จ๋œ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. dbt๊ฐ€ NULL ํ‚ค๋กœ MERGE๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋ชจ๋“  ํ–‰์—์„œ ๋งค์นญ์ด ์‹คํŒจํ•˜์—ฌ ์ค‘๋ณต ์‚ฝ์ž…์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ์›์ธ์€ dbt run --full-refresh๊ฐ€ ์˜๋„์น˜ ์•Š๊ฒŒ ์‹คํ–‰๋œ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ํ…Œ์ด๋ธ”์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ์žฌ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค. ์„ธ ๋ฒˆ์งธ ์›์ธ์€ is_incremental() ํ•„ํ„ฐ๊ฐ€ ํƒ€๊ฒŸ ํ…Œ์ด๋ธ”์— ์•„์ง ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์ปฌ๋Ÿผ์„ ์ฐธ์กฐํ•˜๋Š” ๊ฒฝ์šฐ(์ฒซ ์‹คํ–‰๊ณผ ์ดํ›„ ์‹คํ–‰์˜ ๋™์ž‘ ์ฐจ์ด)์ž…๋‹ˆ๋‹ค. ๋””๋ฒ„๊น…์€ target/compiled/ ๋””๋ ‰ํ† ๋ฆฌ์˜ ์ปดํŒŒ์ผ๋œ SQL ํ™•์ธ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

Q: ํ”„๋กœ๋•์…˜ dbt ํ”„๋กœ์ ํŠธ์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ณ„์ธตํ™”ํ•ด์•ผ ํ•˜๋‚˜์š”?

์†Œ์Šค ์‹ ์„ ๋„ ๊ฒ€์‚ฌ๊ฐ€ ๊ฐ€์žฅ ๋จผ์ € ์‹คํ–‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์†Œ์Šค๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ํ•˜์œ„ ๋ชจ๋ธ์€ ์˜ค๋ž˜๋œ ๋ฐ์ดํ„ฐ๋กœ ์‹คํ–‰๋˜์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. Staging ํ…Œ์ŠคํŠธ์—์„œ๋Š” ์Šคํ‚ค๋งˆ ์ œ์•ฝ ์กฐ๊ฑด(๊ธฐ๋ณธ ํ‚ค์˜ unique + not_null, ํ—ˆ์šฉ๊ฐ’, ํƒ€์ž… ์บ์ŠคํŒ…)์„ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค. Intermediate ํ…Œ์ŠคํŠธ์—์„œ๋Š” ์กฐ์ธ ๊ฐ„ ์ฐธ์กฐ ๋ฌด๊ฒฐ์„ฑ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. Mart ํ…Œ์ŠคํŠธ์—์„œ๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋ถˆ๋ณ€ ์กฐ๊ฑด(์ˆ˜์ต >= 0, ํ™œ์„ฑ ์‚ฌ์šฉ์ž ์ˆ˜ >= ์œ ๋ฃŒ ์‚ฌ์šฉ์ž ์ˆ˜, ๋ถ€๋ถ„์˜ ํ•ฉ = ์ „์ฒด)์„ ์–ด์„œํŠธํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ํ…Œ์ŠคํŠธ๋Š” PR ์‹œ์ ์— dev ์Šคํ‚ค๋งˆ์— ๋Œ€ํ•ด CI์—์„œ ์‹คํ–‰ํ•˜๊ณ , ๋ฐฐํฌ ํ›„์—๋Š” ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์•Œ๋ฆผ๊ณผ ํ•จ๊ป˜ ์žฌ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Q: ๋ชจ๋ธ์„ ephemeral๋กœ ํ•ด์•ผ ํ•  ๋•Œ์™€ view๋กœ ํ•ด์•ผ ํ•  ๋•Œ์˜ ๊ธฐ์ค€์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

ephemeral ๋ชจ๋ธ์€ SQL์„ CTE๋กœ ์†Œ๋น„ ๋ชจ๋ธ์— ์ธ๋ผ์ธํ™”ํ•ฉ๋‹ˆ๋‹ค. ๋…๋ฆฝ์ ์œผ๋กœ ์ฟผ๋ฆฌํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ์žฌ์‚ฌ์šฉ ๋กœ์ง์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. view๋Š” ์ฝ๊ธฐ ์‹œ์ ์— ์—ฐ์‚ฐ๋˜๋ฉฐ ์ฟผ๋ฆฌ ๊ฐ€๋Šฅํ•œ ์˜ค๋ธŒ์ ํŠธ๋กœ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๋กœ, ephemeral ๋ชจ๋ธ์€ ์ง์ ‘ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์—†๊ณ (์–ด์„œ์…˜์„ ์‹คํ–‰ํ•  ํ…Œ์ด๋ธ”์ด ์กด์žฌํ•˜์ง€ ์•Š์Œ), ๋ฐ์ดํ„ฐ ๋ฆฌ๋‹ˆ์ง€ ๋„๊ตฌ์—๋„ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด๋ถ€ ํ—ฌํผ ๋กœ์ง์—๋Š” ephemeral์„, ๋…๋ฆฝ์ ์ธ ํ…Œ์ŠคํŠธ๋‚˜ ๋ชจ๋‹ˆํ„ฐ๋ง์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” view๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Q: source()์™€ ref()์˜ ์ฐจ์ด๋ฅผ ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”.

source()๋Š” sources.yml ํŒŒ์ผ์— ์ •์˜๋œ ์›์‹œ ํ…Œ์ด๋ธ”์„ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค. ์ด ํ…Œ์ด๋ธ”๋“ค์€ dbt๊ฐ€ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๋Š” ๋Œ€์ƒ์ž…๋‹ˆ๋‹ค. ref()๋Š” ๋‹ค๋ฅธ dbt ๋ชจ๋ธ์„ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค. ๋‘ ํ•จ์ˆ˜ ๋ชจ๋‘ DAG ์˜์กด์„ฑ์„ ๋“ฑ๋กํ•˜์ง€๋งŒ, source()๋Š” ์‹ ์„ ๋„ ๊ฒ€์‚ฌ(dbt source freshness)๋„ ํ™œ์„ฑํ™”ํ•œ๋‹ค๋Š” ์ ์ด ref()์™€์˜ ์ฐจ์ด์ž…๋‹ˆ๋‹ค. ์›์‹œ ํ…Œ์ด๋ธ”์—๋Š” source()๋ฅผ, ๊ทธ ์™ธ์—๋Š” ref()๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์„ ํƒ์ด ์•„๋‹Œ ํ•„์ˆ˜์ด๋ฉฐ, dbt๊ฐ€ ๊ด€๋ฆฌ ๋Œ€์ƒ๊ณผ ๋น„๊ด€๋ฆฌ ๋Œ€์ƒ์„ ๊ตฌ๋ถ„ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

๋” ๋„“์€ ๋ฒ”์œ„์˜ ๋ฐ์ดํ„ฐ ์—”์ง€๋‹ˆ์–ด๋ง ๋ฉด์ ‘ ์งˆ๋ฌธ์€ ETL vs ELT ํŒŒ์ดํ”„๋ผ์ธ ์•„ํ‚คํ…์ฒ˜ ๋“ฑ์˜ ์ฃผ์ œ๋ฅผ ํฌํ•จํ•˜์—ฌ, SharpSkill์˜ dbt ๊ธฐ์ดˆ์™€ dbt ๊ณ ๊ธ‰ ํŒจํ„ด ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ์—ฐ์Šต ๋ชจ๋“ˆ์—์„œ ์ฒด๊ณ„์ ์œผ๋กœ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฐ์Šต์„ ์‹œ์ž‘ํ•˜์„ธ์š”!

๋ฉด์ ‘ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์™€ ๊ธฐ์ˆ  ํ…Œ์ŠคํŠธ๋กœ ์ง€์‹์„ ํ…Œ์ŠคํŠธํ•˜์„ธ์š”.

๊ฒฐ๋ก 

  • dbt๋Š” SQL SELECT ๋ฌธ์„ DDL๋กœ ์ž๋™ ์ปดํŒŒ์ผํ•˜์—ฌ ์›จ์–ดํ•˜์šฐ์Šค ๋‚ด ์›์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. Staging/Intermediate/Mart์˜ ๋ ˆ์ด์–ด ๊ตฌ์กฐ๋ฅผ ํ†ตํ•ด ๊ฐ ๋ชจ๋ธ์€ ๋‹จ์ผ ์ฑ…์ž„์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
  • ref() ํ•จ์ˆ˜๋Š” ์˜์กด์„ฑ ๊ด€๋ฆฌ์˜ ํ•ต์‹ฌ์œผ๋กœ, ํ…Œ์ด๋ธ”๋ช… ํ•ด๊ฒฐ๊ณผ DAG ๊ตฌ์ถ•์„ ํ†ตํ•œ ์‹คํ–‰ ์ˆœ์„œ ์ œ์–ด๋ฅผ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค
  • ์ธํฌ๋ฆฌ๋ฉ˜ํƒˆ ๋งคํ„ฐ๋ฆฌ์–ผ๋ผ์ด์ œ์ด์…˜์€ ๋Œ€๊ทœ๋ชจ ํ…Œ์ด๋ธ”์˜ ๋น„์šฉ์„ ์ ˆ๊ฐํ•˜์ง€๋งŒ, unique_key, NULL ๊ฐ’, is_incremental() ํ•„ํ„ฐ์˜ ์„ธ์‹ฌํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค
  • ํ…Œ์ŠคํŠธ๋Š” ๋ฐ์ดํ„ฐ ํ๋ฆ„์— ๋”ฐ๋ผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์†Œ์Šค ์‹ ์„ ๋„ ๊ฒ€์‚ฌ, Staging์˜ ์Šคํ‚ค๋งˆ ์ œ์•ฝ, Intermediate์˜ ์ฐธ์กฐ ๋ฌด๊ฒฐ์„ฑ, Mart์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์–ด์„œ์…˜ ์ˆœ์„œ๊ฐ€ ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค
  • dbt Core v1.10์€ ๋น ๋ฅธ ๋ฐ˜๋ณต ์ž‘์—…์„ ์œ„ํ•œ --sample ํ”Œ๋ž˜๊ทธ๋ฅผ ๋„์ž…ํ–ˆ์œผ๋ฉฐ, Fusion ์—”์ง„(Rust ๊ธฐ๋ฐ˜, ๋ฒ„์ „ 2.0)์ด dbt Cloud์˜ ๊ธฐ๋ณธ ์—”์ง„์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค
  • dbt ๊ด€๋ จ ๋ฉด์ ‘ ์งˆ๋ฌธ์€ ์ •์˜ ์•”๊ธฐ๊ฐ€ ์•„๋‹Œ ์‹ค์ œ ์žฅ์•  ๋””๋ฒ„๊น…(์ธํฌ๋ฆฌ๋ฉ˜ํƒˆ ์žฌ์ฒ˜๋ฆฌ, NULL ํ‚ค, ์˜ค๋ž˜๋œ ์†Œ์Šค)์— ์ดˆ์ ์„ ๋งž์ถ”๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋œ SQL๊ณผ CI ํŒŒ์ดํ”„๋ผ์ธ์— ๋Œ€ํ•œ ์‹ค๋ฌด ๊ฒฝํ—˜์ด ์•”๊ธฐ๋œ ๋‹ต๋ณ€๋ณด๋‹ค ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค

์—ฐ์Šต์„ ์‹œ์ž‘ํ•˜์„ธ์š”!

๋ฉด์ ‘ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์™€ ๊ธฐ์ˆ  ํ…Œ์ŠคํŠธ๋กœ ์ง€์‹์„ ํ…Œ์ŠคํŠธํ•˜์„ธ์š”.

์˜ค๋Š˜์˜ ์ฑŒ๋ฆฐ์ง€

Data Engineering ์ฝ”๋“œ์˜ ๋ฒ„๊ทธ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‚˜์š”

์‹ค์ œ ์ฝ”๋“œ ํ•œ ์กฐ๊ฐ, ์ˆจ์€ ๋ฒ„๊ทธ ํ•˜๋‚˜, ํ•˜๋ฃจ ํ•œ ๋ฒˆ. ๊ณ„์ • ์—†์ด ๋ฐ”๋กœ ๋„์ „ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Anthony Fillion-Maillet

์ž‘์„ฑ์ž

Anthony Fillion-Maillet

SharpSkill ์ฐฝ์—…์ž

10๋…„ ์ด์ƒ ํ’€์Šคํƒ ๊ฐœ๋ฐœ์„ ํ•ด์™”์Šต๋‹ˆ๋‹ค. SharpSkill์„ ์šด์˜ํ•˜๋ฉฐ ์ด๊ณณ์— ๊ฒŒ์‹œ๋˜๋Š” ๋ชจ๋“  ๋‚ด์šฉ์— ์ฑ…์ž„์„ ์ง‘๋‹ˆ๋‹ค.

2026๋…„ 5์›” 25์ผ ์—…๋ฐ์ดํŠธ

ํƒœ๊ทธ

#dbt
#data-engineering
#sql
#data-transformation
#interview

๊ณต์œ 

๊ด€๋ จ ๊ธฐ์‚ฌ

Data Engineering Interview Questions 2026

2026๋…„ ๋ฐ์ดํ„ฐ ์—”์ง€๋‹ˆ์–ด๋ง ๋ฉด์ ‘ ์งˆ๋ฌธ ์ƒ์œ„ 25๊ฐœ

2026๋…„ ๋ฐ์ดํ„ฐ ์—”์ง€๋‹ˆ์–ด๋ง ๋ฉด์ ‘์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์ถœ์ œ๋˜๋Š” 25๊ฐ€์ง€ ํ•ต์‹ฌ ์งˆ๋ฌธ๊ณผ ์‹ค๋ฌด ์ค‘์‹ฌ์˜ ๋‹ต๋ณ€์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Apache Spark 4 ๋ฐ์ดํ„ฐ ์—”์ง€๋‹ˆ์–ด๋ง Structured Streaming ํŒŒ์ดํ”„๋ผ์ธ ๋‹ค์ด์–ด๊ทธ๋žจ

2026๋…„ Apache Spark 4 ์™„๋ฒฝ ๊ฐ€์ด๋“œ: ์‹ ๊ทœ ๊ธฐ๋Šฅ, Structured Streaming, ๋ฉด์ ‘ ์งˆ๋ฌธ

Apache Spark 4์˜ ํ•ต์‹ฌ ์‹ ๊ทœ ๊ธฐ๋Šฅ์ธ ANSI SQL ๋ชจ๋“œ, VARIANT ๋ฐ์ดํ„ฐ ํƒ€์ž…, ์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ ๋ชจ๋“œ, Spark Connect๋ฅผ ์‹ฌ์ธต ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ์—”์ง€๋‹ˆ์–ด๋ง ๋ฉด์ ‘์„ ์œ„ํ•œ ํ•„์ˆ˜ ์งˆ๋ฌธ๊ณผ ๋‹ต๋ณ€๋„ ํ•จ๊ป˜ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

ETL vs ELT data pipeline architecture comparison diagram

2026 ETL vs ELT ์™„๋ฒฝ ๋น„๊ต: ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ๊ฐ€์ด๋“œ

2026๋…„ ETL๊ณผ ELT์˜ ํ•ต์‹ฌ ์ฐจ์ด์ , ๋น„์šฉ ๋ถ„์„, ๊ตฌํ˜„ ํŒจํ„ด์„ ์ƒ์„ธํžˆ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค. dbt, Airflow๋ฅผ ํ™œ์šฉํ•œ ์‹ค์ „ ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ ์„ค๊ณ„ ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์„ธ์š”.