ETL vs ELT. ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ์ ๋ง๋ค ๋ ๊ฐ์ฅ ๋จผ์ ๋ถ๋ชํ๋ ์ ํ. "๋ณํ์ ๋จผ์ ํ๋๋, ์ ์ฌ๋ฅผ ๋จผ์ ํ๋๋"์ ์ฐจ์ด๊ฐ ์ ์ฒด ์ํคํ ์ฒ๋ฅผ ๋ฐ๊พผ๋ค. ๋์ ์ฐจ์ด์ ์ธ์ ๋ฌด์์ ์จ์ผ ํ๋์ง๋ฅผ ํ๋ฆ๋์ ์์ ์ฝ๋๋ก ์ ๋ฆฌํ๋ค.
๋ค์ด๊ฐ๋ฉฐ
๋ฐ์ดํฐ ์์ง๋์ด๋ง์ ์์ํ๋ฉด ๊ฐ์ฅ ๋จผ์ ๋ง๋๋ ์ฝ์ด๊ฐ ETL๊ณผ ELT๋ค. ๊ธ์ ์ธ ๊ฐ์ ์์๋ง ๋ค๋ฅธ๋ฐ, ์ด๊ฒ ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ ์ ์ฒด์ ๋ชจ์์ ๋ฐ๊พผ๋ค. ๊ทธ๋ฆฌ๊ณ ์ต๊ทผ ๋ช ๋ ์ฌ์ด, ์ ๊ณ์ ๋ฌด๊ฒ์ค์ฌ์ด ETL์์ ELT๋ก ์ฎ๊ฒจ๊ฐ๊ณ ์๋ค.
๋ ๋ค ๋ฐ์ดํฐ๋ฅผ ์ถ์ฒ์์ ๊ฐ์ ธ์(Extract), ๊ฐ๊ณตํ๊ณ (Transform), ์ ์ฅํ๋(Load) ๊ณผ์ ์ด๋ค. ์ฐจ์ด๋ ๋จ ํ๋, ๋ณํ(T)์ ์ธ์ ํ๋๋๋ค. ๊ทธ๋ฐ๋ฐ ์ด ์์ ํ๋๊ฐ ๋น์ฉ·์๋·์ ์ฐ์ฑ์ ๋ชจ๋ ์ข์ฐํ๋ค.
ETL์ "๊นจ๋ํ๊ฒ ๊ฐ๊ณตํ ๋ค ์ ์ฅ"ํ๊ณ , ELT๋ "์ผ๋จ ์ ์ฅํ๊ณ ๋์ค์ ๊ฐ๊ณต"ํ๋ค. ์์์ ์ฐจ์ด๊ฐ ์ฒ ํ์ ์ฐจ์ด๋ค.
์ด ๊ธ์์๋ ๋ ๋ฐฉ์์ ์ฐจ์ด์ ์ฅ๋จ์ , ๊ทธ๋ฆฌ๊ณ ์ธ์ ๋ฌด์์ ๊ณจ๋ผ์ผ ํ๋์ง๋ฅผ ํ๋ฆ๋์ ์ฝ๋๋ก ์ ๋ฆฌํ๋ค.
์ธ ๊ธ์์ ์๋ฏธ — E, T, L
๋จผ์ ๊ณตํต ์ฌ๋ฃ๋ถํฐ ๋ณด์. ๋ ๋ฐฉ์ ๋ชจ๋ ๊ฐ์ ์ธ ๋จ๊ณ๋ก ์ด๋ค์ง๋ค.
| ๋จ๊ณ | ์๋ฏธ | ํ๋ ์ผ |
| E (Extract) | ์ถ์ถ | ์๋ณธ ์์ค(DB, API, ๋ก๊ทธ)์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ๋ค |
| T (Transform) | ๋ณํ | ์ ์ ·๊ฐ๊ณต·์ง๊ณํ๋ค (ํ์ ํต์ผ, ์ค๋ณต ์ ๊ฑฐ ๋ฑ) |
| L (Load) | ์ ์ฌ | ๋ชฉ์ ์ง(DW, ๋ฐ์ดํฐ ๋ ์ดํฌ)์ ์ ์ฅํ๋ค |
ETL๊ณผ ELT๋ ์ด ์ค T์ L์ ์์๋ง ๋ค๋ฅด๋ค. ๊ทธ๊ฒ ์ ๋ถ๋ค. ๊ทธ๋ฐ๋ฐ ๊ทธ ๊ฒฐ๊ณผ๋ ๊ฝค ๋ค๋ฅด๋ค.
ETL — ๋ณํ ํ ์ ์ฌ (์ ํต์ ๋ฐฉ์)
ETL์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํ ๋ค์ ์ ์ฅํ๋ค. ์ถ์ถ → ๋ณํ → ์ ์ฌ ์์๋ค.

์๋ณธ์์ ๋ฐ์ดํฐ๋ฅผ ๊บผ๋ด, ๋ณ๋์ ์ฒ๋ฆฌ ๊ณต๊ฐ์์ ๊นจ๋ํ๊ฒ ๊ฐ๊ณตํ ๋ค, ์ต์ข ํํ๋ก ๋ฐ์ดํฐ ์จ์ดํ์ฐ์ค์ ์ ์ฌํ๋ค. ์จ์ดํ์ฐ์ค์๋ ์ด๋ฏธ ์ ์ ๋ ๋ฐ์ดํฐ๋ง ๋ค์ด๊ฐ๋ค.
# ETL: ๋ณํ์ ๋จผ์ , ๊ทธ ๋ค์ ์ ์ฌ (๊ฐ๋
์์)
import pandas as pd
# 1. Extract — ์๋ณธ์์ ์ถ์ถ
raw = pd.read_csv("sales_raw.csv")
# 2. Transform — ์ ์ฌ ์ ์ ๊ฐ๊ณต
df = raw.dropna(subset=["amount"]) # ๊ฒฐ์ธก์น ์ ๊ฑฐ
df["amount"] = df["amount"].astype(int) # ํ์
๋ณํ
df["date"] = pd.to_datetime(df["date"]) # ๋ ์ง ํ์ฑ
df = df[df["amount"] > 0] # ์ด์์น ์ ๊ฑฐ
daily = df.groupby("date")["amount"].sum() # ์ผ๋ณ ์ง๊ณ
# 3. Load — ๊ฐ๊ณต๋ ๊ฒฐ๊ณผ๋ง ์จ์ดํ์ฐ์ค์ ์ ์ฌ
daily.to_sql("daily_sales", warehouse_conn, if_exists="replace")
์จ์ดํ์ฐ์ค์๋ daily_sales๋ผ๋ ์ด๋ฏธ ์ง๊ณ·์ ์ ๋ ํ
์ด๋ธ๋ง ๋ค์ด๊ฐ๋ค. ์๋ณธ์ ์ง์ ๋ถํ ๋ฐ์ดํฐ๋ ๋ค์ด๊ฐ์ง ์๋๋ค.
์ฅ์
- ์จ์ดํ์ฐ์ค์ ๊นจ๋ํ ๋ฐ์ดํฐ๋ง ์ ์ฅ๋ผ ์กฐํ๊ฐ ๋น ๋ฅด๊ณ ์ผ๊ด์ ์ด๋ค.
- ๋ฏผ๊ฐ ์ ๋ณด๋ฅผ ์ ์ฌ ์ ์ ๊ฑธ๋ฌ๋ผ ์ ์์ด ๊ท์ ·๋ณด์์ ์ ๋ฆฌํ๋ค.
- ์จ์ดํ์ฐ์ค ์ ์ฅ ๋น์ฉ์ด ์ ๋ค (์ ์ ๋ ๊ฒ๋ง ๋ฃ์ผ๋๊น).
๋จ์
- ๋ณํ ๋ก์ง์ ๋ฏธ๋ฆฌ ๋ค ์ ํด์ผ ํ๋ค. ๋์ค์ "๋ค๋ฅธ ํํ๋ก ๋ณด๊ณ ์ถ๋ค"๋ฉด ํ์ดํ๋ผ์ธ์ ๋ค์ ์ง์ผ ํ๋ค.
- ์๋ณธ์ ๋ฒ๋ฆฌ๋ฏ๋ก ๋์ค์ ๋ค๋ฅธ ๋ถ์์ ํ๊ธฐ ์ด๋ ต๋ค.
- ๋ณ๋ ๋ณํ ์๋ฒ·๋๊ตฌ๊ฐ ํ์ํด ๊ตฌ์กฐ๊ฐ ๋ฌด๊ฒ๋ค.
ELT — ์ ์ฌ ํ ๋ณํ (ํ๋์ ๋ฐฉ์)
ELT๋ ์์๋ฅผ ๋ค์ง๋๋ค. ์ผ๋จ ์๋ณธ์ ๊ทธ๋๋ก ์ ์ฅํ๊ณ , ํ์ํ ๋ ๋ณํํ๋ค. ์ถ์ถ → ์ ์ฌ → ๋ณํ ์์๋ค.

์๋ณธ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณต ์์ด ๊ฑฐ์ ๊ทธ๋๋ก ๋ฐ์ดํฐ ์จ์ดํ์ฐ์ค(๋๋ ๋ ์ดํฌ)์ ๋จผ์ ์๋๋ค. ๋ณํ์ ์ ์ฅ๋ ํ์, ๊ฐ๋ ฅํ ์จ์ดํ์ฐ์ค์ ์ฐ์ฐ ๋ฅ๋ ฅ์ ์ด์ฉํด SQL๋ก ์ฒ๋ฆฌํ๋ค.
-- ELT: ์๋ณธ์ ๋จผ์ ์ ์ฌํ ๋ค, ์จ์ดํ์ฐ์ค ์์์ SQL๋ก ๋ณํ
-- 1. Extract + Load — ์๋ณธ์ ๊ทธ๋๋ก ์ ์ฌ (raw ํ
์ด๋ธ)
-- (์ ์ฌ๋ Fivetran, Airbyte ๊ฐ์ ๋๊ตฌ๊ฐ ๋ด๋น)
-- 2. Transform — ์จ์ดํ์ฐ์ค ์์์ SQL๋ก ๋ณํ (ํ์ํ ๋)
CREATE TABLE daily_sales AS
SELECT
DATE(created_at) AS date,
SUM(amount) AS total
FROM raw_sales -- ์๋ณธ ๊ทธ๋๋ก ์์ธ ํ
์ด๋ธ
WHERE amount > 0
GROUP BY DATE(created_at);
์๋ณธ(raw_sales)์ด ์จ์ดํ์ฐ์ค์ ๊ทธ๋๋ก ๋จ์ ์๋ค. ๊ทธ๋์ ๋์ค์ "์ผ๋ณ์ด ์๋๋ผ ์๊ฐ๋ณ๋ก ๋ณด๊ณ ์ถ๋ค"๋ฉด, ํ์ดํ๋ผ์ธ์ ๋ค์ ์งค ํ์ ์์ด SQL๋ง ์๋ก ์ฐ๋ฉด ๋๋ค.
์ฅ์
- ์๋ณธ์ด ๊ทธ๋๋ก ๋จ์, ๋์ค์ ์ด๋ค ๋ถ์์ด๋ ๋ค์ ํ ์ ์๋ค. (์ ์ฐ์ฑ)
- ์ ์ฌ๊ฐ ๋จ์ํด ํ์ดํ๋ผ์ธ ๊ตฌ์ถ์ด ๋น ๋ฅด๋ค.
- ๋ณํ์ ์จ์ดํ์ฐ์ค์ ๊ฐ๋ ฅํ ์ฐ์ฐ์ผ๋ก ์ฒ๋ฆฌ → ๋์ฉ๋์ ๊ฐํ๋ค.
๋จ์
- ์๋ณธ๊น์ง ๋ค ์ ์ฅํ๋ฏ๋ก ์ ์ฅ ๋น์ฉ์ด ํฌ๋ค.
- ๊ฐ๊ณต ์ ๋ฐ์ดํฐ๊ฐ ์จ์ดํ์ฐ์ค์ ์์ด ๊ฑฐ๋ฒ๋์ค·๋ณด์ ๊ด๋ฆฌ๊ฐ ํ์ํ๋ค.
- ๋ณํ ์ ๋ ๋ฐ์ดํฐ๊ฐ ์์ฌ ์์ด ์ ๋ฆฌ ์ ํ๋ฉด ํผ๋์ค๋ฌ์ธ ์ ์๋ค.
ํ๋์ ๋น๊ต
| ETL | ELT | |
| ์์ | ์ถ์ถ → ๋ณํ → ์ ์ฌ | ์ถ์ถ → ์ ์ฌ → ๋ณํ |
| ๋ณํ ์์น | ๋ณ๋ ์ฒ๋ฆฌ ๊ณต๊ฐ | ์จ์ดํ์ฐ์ค ๋ด๋ถ |
| ์ ์ฅ ๋ฐ์ดํฐ | ์ ์ ๋ ๋ฐ์ดํฐ๋ง | ์๋ณธ + ์ ์ ๋ฐ์ดํฐ |
| ์ ์ฐ์ฑ | ๋ฎ์ (๋ฏธ๋ฆฌ ์ ์) | ๋์ (๋์ค์ ๋ณํ) |
| ์ ์ฅ ๋น์ฉ | ์ ์ | ๋ง์ |
| ๊ตฌ์ถ ์๋ | ๋๋ฆผ | ๋น ๋ฆ |
| ์ ํฉํ ๊ฒฝ์ฐ | ์ ์ ·๋ณด์ ์ฐ์ , ์ ํ ๋ฐ์ดํฐ | ๋์ฉ๋, ์ ์ฐํ ๋ถ์, ํด๋ผ์ฐ๋ DW |
์ ์์ฆ์ ELT๋ก ๊ธฐ์ฐ๋
์์ ์ ETL์ด ํ์ค์ด์๋ค. ์ ์ฅ ๊ณต๊ฐ์ด ๋น์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋์ "๊ผญ ํ์ํ ์ ์ ๋ ๋ฐ์ดํฐ๋ง" ์ ์ฅํ๋ ETL์ด ํฉ๋ฆฌ์ ์ด์๋ค.
๊ทธ๋ฐ๋ฐ ํด๋ผ์ฐ๋ ๋ฐ์ดํฐ ์จ์ดํ์ฐ์ค(Snowflake, BigQuery, Redshift)๊ฐ ๋ฑ์ฅํ๋ฉฐ ํ์ด ๋ฐ๋์๋ค.
- ์ ์ฅ ๋น์ฉ์ด ์ธ์ก๋ค → ์๋ณธ์ ๋ค ์์๋ ๋ถ๋ด์ด ์ ๋ค.
- ์จ์ดํ์ฐ์ค ์ฐ์ฐ์ด ๊ฐ๋ ฅํด์ก๋ค → ๋ณํ์ ๊ตณ์ด ๋ฐ์์ ์ ํ๊ณ ์์์ SQL๋ก ์ฒ๋ฆฌํ๋ฉด ๋๋ค.
- ๋ถ์ ์๊ตฌ๊ฐ ๋นจ๋ฆฌ ๋ฐ๋๋ค → ์๋ณธ์ ๋จ๊ฒจ๋๋ฉด ์ ์๊ตฌ์ SQL๋ง ๋ฐ๊ฟ ๋์ํ ์ ์๋ค.
์ด ์ธ ๊ฐ์ง ๋ณํ๊ฐ ELT๋ฅผ ํ๋ ๋ฐ์ดํฐ ์คํ์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋ง๋ค์๋ค. dbt ๊ฐ์ ๋๊ตฌ๊ฐ "์จ์ดํ์ฐ์ค ์์์์ ๋ณํ(T)"์ ์ ๋ดํ๋ฉฐ ELT ์ํ๊ณ๊ฐ ์ปค์ก๋ค.
ํ ์ค ์์ฝ: ์ ์ฅ์ด ์ธ์ง๊ณ ์ฐ์ฐ์ด ๊ฐํด์ง์, "์ผ๋จ ๋ค ์๊ณ ๋์ค์ ๊ฐ๊ณต"ํ๋ ELT๊ฐ ํฉ๋ฆฌ์ ์ด ๋๋ค.
๊ทธ๋์, ๋ฌด์์ ์จ์ผ ํ๋
ํ์ค์ ์ธ ์ ํ ๊ธฐ์ค์ ์ด๋ ๋ค.
ETL์ด ๋ง๋ ๊ฒฝ์ฐ
- ๋ฏผ๊ฐ ์ ๋ณด๋ฅผ ์ ์ฌ ์ ์ ๋ฐ๋์ ๊ฑธ๋ฌ์ผ ํ ๋ (์๋ฃ·๊ธ์ต ๊ท์ )
- ๋ฐ์ดํฐ ํํ๊ฐ ๋ช ํํ๊ณ ๋ณํ ๊ท์น์ด ์์ ์ ์ผ ๋
- ์จํ๋ ๋ฏธ์ค ํ๊ฒฝ์ด๊ฑฐ๋ ์ ์ฅ ๋น์ฉ์ ๋นก๋นกํ๊ฒ ๊ด๋ฆฌํด์ผ ํ ๋
ELT๊ฐ ๋ง๋ ๊ฒฝ์ฐ
- ํด๋ผ์ฐ๋ ๋ฐ์ดํฐ ์จ์ดํ์ฐ์ค๋ฅผ ์ธ ๋ (๋๋ถ๋ถ์ ์ ๊ท ํ๋ก์ ํธ)
- ๋ถ์ ์๊ตฌ๊ฐ ์์ฃผ ๋ฐ๋๊ณ ์ ์ฐ์ฑ์ด ์ค์ํ ๋
- ๋ฐ์ดํฐ๊ฐ ๋์ฉ๋์ด๊ณ ๋น์ ํ์ด ์์ฌ ์์ ๋
๋๋ถ๋ถ์ ์ ํ๋ก์ ํธ๋ ํด๋ผ์ฐ๋ DW ์์์ ELT๋ก ์์ํ๋ ๊ฒ ์์ฆ ํ๋ฆ์ด๋ค. ๋ค๋ง "๋ฌด์กฐ๊ฑด ELT"๊ฐ ์๋๋ผ, ๊ท์ ๋ ๋ณด์ ๋๋ฌธ์ ์ ์ฌ ์ ์ ์ ๊ฐ ํ์ํ๋ฉด ETL์ด ์ฌ์ ํ ๋ต์ด๋ค. ๋์ ์์ด ์ฐ๊ธฐ๋ ํ๋ค.
๋ง์น๋ฉฐ
ETL๊ณผ ELT๋ ์ฐ์ด์ ๋ฌธ์ ๊ฐ ์๋๋ผ ์์์ ์ ํ์ด๊ณ , ๊ทธ ์ ํ์ ํ๊ฒฝ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ค. ์ ์ฅ์ด ๋น์ธ๊ณ ์ ์ ๊ฐ ์ฐ์ ์ด๋ฉด ETL, ์ ์ฅ์ด ์ธ๊ณ ์ ์ฐ์ฑ์ด ์ฐ์ ์ด๋ฉด ELT๋ค. ๊ทธ๋ฆฌ๊ณ ํด๋ผ์ฐ๋๊ฐ ๋ณดํธํ๋ ์ง๊ธ์ ๊ทธ ๋ฌด๊ฒ์ค์ฌ์ด ELT๋ก ๊ธฐ์ธ์ด ์๋ค.
ํต์ฌ์ ์ฝ์ด๋ฅผ ์ธ์ฐ๋ ๊ฒ ์๋๋ผ, "๋ณํ์ ์ธ์ ํ๋๊ฐ"๊ฐ ๋น์ฉ·์ ์ฐ์ฑ·๋ณด์์ ์ด๋ป๊ฒ ๋ฐ๊พธ๋์ง ์ดํดํ๋ ๊ฒ์ด๋ค. ๊ทธ๊ฑธ ์๋ฉด "์ฐ๋ฆฌ ์ํฉ์ ๋ญ๊ฐ ๋ง์ง?"๋ผ๋ ์ง๋ฌธ์ ์ค์ค๋ก ๋ตํ ์ ์๋ค. ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ ์ค๊ณ์ ์ฒซ ๋จ์ถ๊ฐ ๋ฐ๋ก ์ด ์ ํ์ด๋ค.
์ฐธ๊ณ ์ถ์ฒ
- AWS: ETL vs ELT — https://aws.amazon.com/compare/the-difference-between-etl-and-elt/
- dbt: What is ELT? — https://www.getdbt.com/blog/etl-vs-elt
- Fivetran: ETL vs ELT — https://www.fivetran.com/blog/etl-vs-elt
'๐ Data Science & AI > Data Engineering' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| Kafka ์ ๋ฌธ (1) | 2026.06.25 |
|---|---|
| Airflow๋ก ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ ๋ง๋ค๊ธฐ (2) | 2026.06.24 |
| Spark๋ฅผ Kubernetes ์์ ์ฌ๋ฆฌ๋ฉด ๋ฌด์์ด ๋ฌ๋ผ์ง๋๊ฐ (0) | 2026.04.20 |
| ๋ฐ์ดํฐ ์ข ๋ฅ์ ์ดํด์ ๋ถ์ ํ๋ก์ธ์ค (0) | 2026.02.27 |
