๋ฐ์ดํ„ฐ ์—”์ง€๋‹ˆ์–ด๋ง ํŒŒ์ดํ”„๋ผ์ธ์—์„œ dbt์™€ Airflow๋Š” ์ข…์ข… ํ•จ๊ป˜ ์‚ฌ์šฉ๋œ๋‹ค. ์—ฌ๊ธฐ์„œ ์ž์ฃผ ๋งˆ์ฃผํ•˜๋Š” ์„ค๊ณ„ ๊ฒฐ์ •์ด ์žˆ๋‹ค: dbt๋ฅผ Airflow์™€ ์–ด๋–ป๊ฒŒ ํ•จ๊ป˜ ์‹คํ–‰ํ•  ๊ฒƒ์ธ๊ฐ€?

  • dbt๋ฅผ ๋ณ„๋„์˜ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‹คํ–‰ํ•˜๊ณ  API๋‚˜ CLI ํ˜ธ์ถœ๋กœ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ํ•  ๊ฒƒ์ธ๊ฐ€?
  • ์•„๋‹ˆ๋ฉด dbt๋ฅผ Airflow์˜ Docker ์ปจํ…Œ์ด๋„ˆ ์•ˆ์—์„œ ์ง์ ‘ ์‹คํ–‰ํ•  ๊ฒƒ์ธ๊ฐ€?

๋‘˜ ๋‹ค ์‹คํ—˜ํ•ด๋ณธ ๊ฒฐ๊ณผ, dbt๋ฅผ Airflow ์ปจํ…Œ์ด๋„ˆ ์•ˆ์—์„œ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹์„ ์„ ํ˜ธํ•œ๋‹ค.

์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

โœ… ํ•˜๋‚˜์˜ ์ปจํ…Œ์ด๋„ˆ = ํ•˜๋‚˜์˜ ํ™˜๊ฒฝ

  • Airflow DAG๊ฐ€ ๋™์ผํ•œ ์ปจํ…Œ์ด๋„ˆ ์•ˆ์—์„œ dbt ๋ช…๋ น์–ด๋ฅผ ์ง์ ‘ ์‹คํ–‰ํ•œ๋‹ค.
  • ์ด๋ฅผ ํ†ตํ•ด ๋‹ค์Œ์ด ๋ณด์žฅ๋œ๋‹ค:
    • ๋™์ผํ•œ Python ๋ฒ„์ „
    • ๋™์ผํ•œ dbt ๋ฒ„์ „
    • ๋™์ผํ•œ ์˜์กด์„ฑ ๋ฒ„์ „ (dbt ํŒจํ‚ค์ง€, ์–ด๋Œ‘ํ„ฐ)
    • ์ปจํ…Œ์ด๋„ˆ ๊ฐ„ ๋„คํŠธ์›Œํ‚น ์ด์Šˆ ์—†์Œ

๋ณ„๋„์˜ ์ปจํ…Œ์ด๋„ˆ๋กœ ๋ถ„๋ฆฌํ•  ๊ฒฝ์šฐ ๋‹ค์Œ์„ ๊ด€๋ฆฌํ•ด์•ผ ํ•œ๋‹ค:

  • ๋‘ ๊ฐœ์˜ Docker ์ด๋ฏธ์ง€ ์œ ์ง€
  • dbt ๋ฒ„์ „ ์ˆ˜๋™ ๋™๊ธฐํ™”
  • ๋ณผ๋ฅจ ๋งˆ์šดํŠธ, ํŒŒ์ผ ์ ‘๊ทผ ๋“ฑ ์ปจํ…Œ์ด๋„ˆ ๊ฐ„ ํŒŒ์ผ ์‹œ์Šคํ…œ ๋ฌธ์ œ ํ•ด๊ฒฐ

โœ… ๊ฐ„์†Œํ™”๋œ ์˜์กด์„ฑ ๊ด€๋ฆฌ

  • Airflow๊ฐ€ dbt ํ™˜๊ฒฝ์„ ์™„์ „ํžˆ ์ œ์–ดํ•œ๋‹ค.
  • ์ปจํ…Œ์ด๋„ˆ ๊ฐ„ API ๋˜๋Š” CLI ํ˜ธ์ถœ์„ ๋…ธ์ถœํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.
  • ํŒจํ‚ค์ง€ ์—…๊ทธ๋ ˆ์ด๋“œ (dbt, dbt-bigquery, dbt-postgres ๋“ฑ)๊ฐ€ ์ž๋™์œผ๋กœ ๋™๊ธฐํ™”๋œ๋‹ค.

CI/CD ํŒŒ์ดํ”„๋ผ์ธ์—์„œ๋Š” Airflow์™€ dbt๊ฐ€ ๋ชจ๋‘ ์„ค์น˜๋œ ๋‹จ์ผ Docker ์ด๋ฏธ์ง€๋งŒ ๋นŒ๋“œํ•˜๋ฉด ๋œ๋‹ค โ€” ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ํ›จ์”ฌ ๋‹จ์ˆœํ•˜๋‹ค.

โœ… ๊น”๋”ํ•œ DAG ์ฝ”๋“œ

Airflow ํƒœ์Šคํฌ์—์„œ ๋‹จ์ˆœํžˆ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๋‹ค:

BashOperator(
    task_id="run_dbt",
    bash_command="dbt run --project-dir /opt/airflow/dbt"
)

โœ… ์‰ฌ์šด ๋กœ์ปฌ ๊ฐœ๋ฐœ

  • ํ•˜๋‚˜์˜ docker-compose.yml๋กœ ๋ชจ๋“  ์„œ๋น„์Šค ์‹คํ–‰.
  • dbt์™€ Airflow ์ปจํ…Œ์ด๋„ˆ ๊ฐ„ ๋ณต์žกํ•œ ๋„คํŠธ์›Œํ‚น์ด๋‚˜ ๊ณต์œ  ๋ณผ๋ฅจ ์„ค์ • ๋ถˆํ•„์š”.
  • “dbt๊ฐ€ Airflow ์•ˆ์— ์ œ๋Œ€๋กœ ์„ค์น˜๋๋‚˜? ์ด ๋ณผ๋ฅจ ๋งˆ์šดํŠธ๊ฐ€ ์กด์žฌํ•˜๋‚˜?” ์ด๋Ÿฐ ๊ณ ๋ฏผ ๋ถˆํ•„์š”.
  • ๊ทธ๋ƒฅ ๋™์ž‘ํ•œ๋‹ค.

โœ… ์‰ฌ์šด ๋””๋ฒ„๊น…

dbt๊ฐ€ Airflow ์•ˆ์—์„œ ์‹คํŒจํ•  ๊ฒฝ์šฐ:

  • ๋กœ๊ทธ๊ฐ€ Airflow์— ์™„์ „ํžˆ ์บก์ฒ˜๋œ๋‹ค.
  • dbt ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ Airflow UI์—์„œ ๋ฐ”๋กœ ํ™•์ธ ๊ฐ€๋Šฅ.
  • ์ปจํ…Œ์ด๋„ˆ๋‚˜ ๋กœ๊ทธ ํŒŒ์ผ์„ ์™”๋‹ค๊ฐ”๋‹ค ํ•  ํ•„์š” ์—†๋‹ค.

โœ… ์ผ๊ด€๋œ ๋ฐ์ดํ„ฐ ์—”์ง€๋‹ˆ์–ด๋ง ์ฒ ํ•™: ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜์ด ์‹คํ–‰์„ ์†Œ์œ ํ•ด์•ผ ํ•œ๋‹ค

  • Airflow๊ฐ€ dbt๋ฅผ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ํ•˜๋ฏ€๋กœ, dbt์˜ ๋Ÿฐํƒ€์ž„๊นŒ์ง€ ์†Œ์œ ํ•ด์•ผ ํ•œ๋‹ค.
  • Docker ์ด๋ฏธ์ง€๋Š” ์ž‘์—… ๋‹จ์œ„๋ฅผ ์™„์ „ํžˆ ๋ฐ˜์˜ํ•ด์•ผ ํ•˜๋ฉฐ, ์ชผ๊ฐœ์ง„ ๋งˆ์ดํฌ๋กœ ์ปจํ…Œ์ด๋„ˆ๋ณด๋‹ค๋Š” ์ผ์ฒดํ˜•์ด ๋‚ซ๋‹ค.

๐Ÿ”ง ๋‚˜์˜ ์ผ๋ฐ˜์ ์ธ ์…‹์—…

Airflow Docker ์ด๋ฏธ์ง€๋ฅผ ํ™•์žฅํ•˜์—ฌ dbt๋ฅผ ์„ค์น˜ํ•œ๋‹ค:

FROM apache/airflow:2.9.0

USER root

RUN pip install dbt-core dbt-bigquery dbt-postgres dbt-snowflake

USER airflow
  • DAG์™€ dbt ํ”„๋กœ์ ํŠธ ๋ชจ๋‘ Airflow ๊ณต์œ  ๋ณผ๋ฅจ (/opt/airflow/) ์•ˆ์— ์กด์žฌ.
  • ๊ฐœ๋ฐœ, ์Šคํ…Œ์ด์ง•, ์šด์˜ ๋ชจ๋‘ ๋™์ผํ•œ ํ™˜๊ฒฝ ์œ ์ง€.

๐Ÿš€ ์–ธ์ œ ๋ณ„๋„ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ• ๊นŒ?

  • ๋งค์šฐ ํฐ dbt ์ž‘์—…์„ ์˜คํ† ์Šค์ผ€์ผ๋ง ์›Œ์ปค(์˜ˆ: Kubernetes Executor)๋กœ ์‹คํ–‰ํ•  ๋•Œ
  • ์™„์ „ ๊ด€๋ฆฌํ˜• dbt Cloud๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ
  • ๋ฉ€ํ‹ฐํ…Œ๋„ŒํŠธ dbt ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜์ผ ๋•Œ

์ผ๋ฐ˜์ ์ธ ๋ฐ์ดํ„ฐ ์—”์ง€๋‹ˆ์–ด๋ง ํŒŒ์ดํ”„๋ผ์ธ์˜ 95%์—์„œ๋Š” Airflow ์ปจํ…Œ์ด๋„ˆ ์•ˆ์—์„œ dbt๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋‹จ์ˆœํ•˜๊ณ , ๋น ๋ฅด๊ณ , ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ์ข‹๋‹ค.

๐Ÿ”ฅ ๊ฒฐ๋ก 

โ€œdbt๋ฅผ Airflow ์ปจํ…Œ์ด๋„ˆ ์•ˆ์—์„œ ์ง์ ‘ ์‹คํ–‰ํ•จ์œผ๋กœ์จ ํ™˜๊ฒฝ ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•˜๊ณ , ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜์„ ๋‹จ์ˆœํ™”ํ•˜๋ฉฐ, ์‹คํŒจ ์ง€์ ์„ ์ตœ์†Œํ™”ํ•œ๋‹ค. ์ด๋กœ์จ DAG๋Š” ํœด๋Œ€์„ฑ์ด ๋†’๊ณ  ๋””๋ฒ„๊น…์ด ์‰ฌ์›Œ์ง„๋‹ค.โ€