ETL & Data Pipeline
ETL vs ELT, CDC, 배치/실시간 파이프라인, Airflow, 오류 처리
📚 시리즈 네비게이션
| 이전 | 현재 | 다음 |
|---|---|---|
| Data Lake | ETL & Pipeline | BI & Analytics |
→ 시리즈 목차
🎯 ETL이란?
ETL (Extract, Transform, Load): 데이터를 추출하고, 변환하고, 적재하는 프로세스
flowchart LR Source["원천<br/>시스템"] Extract["Extract<br/>추출"] Transform["Transform<br/>변환"] Load["Load<br/>적재"] Target["목적지<br/>(DW 등)"] Source --> Extract --> Transform --> Load --> Target
📊 ETL 각 단계 상세
1. Extract (추출)
원천 시스템에서 데이터를 가져오는 단계임.
| 추출 방식 | 설명 | 용도 |
|---|---|---|
| Full Extract | 전체 데이터 추출 | 초기 적재, 소규모 테이블 |
| Incremental | 변경분만 추출 | 일반적, 대규모 테이블 |
변경분 감지 방법 (CDC):
| 방법 | 설명 | 장단점 |
|---|---|---|
| Timestamp | 수정일시 컬럼 기준 | 간단, 삭제 감지 불가 |
| Trigger | DB 트리거로 로그 테이블 | 정확, DB 부하 |
| Log-based | DB 트랜잭션 로그 분석 | 정확, 구현 복잡 |
| Diff | 이전/현재 비교 | 범용, 느림 |
2. Transform (변환)
데이터를 목적에 맞게 정제하고 변환하는 단계임.
주요 변환 작업:
| 작업 | 설명 | 예시 |
|---|---|---|
| 정제 (Cleansing) | 오류/결측 처리 | NULL → 기본값 |
| 형식 변환 | 데이터 타입, 포맷 | 날짜 형식 통일 |
| 코드 매핑 | 코드 → 값 변환 | ’M’ → ‘남성’ |
| 집계 | 합계, 평균 등 | 일별 매출 합계 |
| 조인 | 테이블 결합 | 주문 + 고객 |
| 중복 제거 | Deduplication | 동일 레코드 제거 |
| 파생 컬럼 | 계산된 값 생성 | 나이 = 현재년 - 생년 |
3. Load (적재)
변환된 데이터를 목적지에 저장하는 단계임.
| 적재 방식 | 설명 | 용도 |
|---|---|---|
| Full Load | 전체 삭제 후 재적재 | 초기, 소규모 |
| Incremental | 신규 데이터만 추가 | 일반적 |
| Upsert (Merge) | 있으면 UPDATE, 없으면 INSERT | SCD Type 1 |
-- Oracle MERGE 예시
MERGE INTO target_table t
USING source_table s
ON (t.id = s.id)
WHEN MATCHED THEN
UPDATE SET t.name = s.name, t.updated_at = SYSDATE
WHEN NOT MATCHED THEN
INSERT (id, name, created_at) VALUES (s.id, s.name, SYSDATE);🔄 ETL vs ELT
| 구분 | ETL | ELT |
|---|---|---|
| 순서 | Extract → Transform → Load | Extract → Load → Transform |
| 변환 위치 | 별도 ETL 서버 | 목적지 (DW/Data Lake) |
| 적합 환경 | 전통적 DW | 클라우드, 빅데이터 |
| 장점 | 정제된 데이터만 적재 | 원본 보존, 유연한 변환 |
| 단점 | ETL 서버 부하 | 목적지 리소스 사용 |
| 도구 예시 | Informatica, ODI | Spark, DBT, BigQuery |
flowchart TB subgraph ETL["ETL"] direction LR E1["원천"] --> E2["ETL 서버<br/>(변환)"] --> E3["DW"] end subgraph ELT["ELT"] direction LR L1["원천"] --> L2["Data Lake/DW<br/>(원본 저장)"] --> L3["변환<br/>(SQL/Spark)"] end
🛠️ ETL 도구
상용 ETL
| 도구 | 벤더 | 특징 |
|---|---|---|
| Informatica PowerCenter | Informatica | 엔터프라이즈 표준, GUI 기반 |
| Oracle ODI | Oracle | Oracle 환경 최적화 |
| IBM DataStage | IBM | 대규모 환경 |
| Talend | Talend | 오픈소스 버전 있음 |
| SSIS | Microsoft | SQL Server 통합 |
오픈소스 / 클라우드
| 도구 | 특징 |
|---|---|
| Apache Airflow | 워크플로우 오케스트레이션 (Python) |
| Apache NiFi | 실시간 데이터 흐름, GUI |
| Prefect | Airflow 대안, 현대적 |
| Dagster | 데이터 자산 중심 |
| AWS Glue | 서버리스 ETL |
| Azure Data Factory | Azure 통합 |
| dbt | SQL 기반 Transform (ELT의 T) |
🔀 데이터 파이프라인 패턴
배치 파이프라인 (Batch)
일정 주기로 데이터를 처리함.
flowchart LR Source["원천 DB<br/>매일 추출"] Staging["Staging<br/>매일 새벽<br/>임시 저장"] Transform["Transform<br/>변환 로직<br/>적용"] DW["DW<br/>적재 완료"] Source --> Staging --> Transform --> DW
특징:
- 일/주/월 단위 실행
- 대용량 처리에 적합
- 지연 시간 허용
실시간 파이프라인 (Streaming)
데이터가 발생하면 즉시 처리함.
flowchart LR Event["이벤트 발생<br/>실시간 발행"] Kafka["Kafka<br/>큐잉/버퍼링"] Spark["Spark Streaming<br/>실시간 처리"] Target["목적지<br/>즉시 반영"] Event --> Kafka --> Spark --> Target
특징:
- 초/분 단위 지연
- 이벤트 기반 처리
- 복잡도 높음
Lambda 아키텍처
배치 + 실시간 결합한 구조임.
flowchart TB Source["원천"] Batch["Batch Layer<br/>(정확성, 재처리 가능)"] Speed["Speed Layer<br/>(실시간, 근사치)"] Query["쿼리 레이어"] Source --> Batch --> Query Source --> Speed --> Query
📅 스케줄링 & 오케스트레이션
Apache Airflow
가장 많이 쓰이는 워크플로우 오케스트레이션 도구임.
핵심 개념:
| 개념 | 설명 |
|---|---|
| DAG | Directed Acyclic Graph, 작업 흐름 정의 |
| Task | 개별 작업 단위 |
| Operator | Task 유형 (BashOperator, PythonOperator 등) |
| Schedule | 실행 주기 (cron 표현식) |
# Airflow DAG 예시
from airflow import DAG
from airflow.operators.python import PythonOperator
from datetime import datetime
def extract():
print("Extracting data...")
def transform():
print("Transforming data...")
def load():
print("Loading data...")
with DAG(
'etl_pipeline',
start_date=datetime(2026, 1, 1),
schedule_interval='0 2 * * *', # 매일 새벽 2시
catchup=False
) as dag:
t1 = PythonOperator(task_id='extract', python_callable=extract)
t2 = PythonOperator(task_id='transform', python_callable=transform)
t3 = PythonOperator(task_id='load', python_callable=load)
t1 >> t2 >> t3 # 의존성: extract → transform → load📋 ETL 설계 시 고려사항
데이터 품질
| 항목 | 설명 | 처리 방법 |
|---|---|---|
| NULL 처리 | 결측치 | 기본값, 제외, 추정 |
| 중복 | 동일 레코드 | 제거, 최신만 유지 |
| 형식 오류 | 잘못된 데이터 | 변환, 거부 |
| 범위 오류 | 비정상 값 | 검증, 거부 |
오류 처리
| 전략 | 설명 |
|---|---|
| 거부 (Reject) | 오류 레코드 별도 저장 |
| 기본값 | 오류 시 기본값으로 대체 |
| 중단 | 오류 발생 시 전체 중단 |
| 재시도 | 일시적 오류 시 재시도 |
재처리 (Reprocessing)
| 방식 | 설명 |
|---|---|
| Idempotent | 여러 번 실행해도 결과 동일 |
| Rerunnable | 실패 시 재실행 가능 |
| Backfill | 과거 데이터 소급 처리 |