ETL & Data Pipeline

ETL vs ELT, CDC, 배치/실시간 파이프라인, Airflow, 오류 처리


📚 시리즈 네비게이션

이전현재다음
Data LakeETL & PipelineBI & 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수정일시 컬럼 기준간단, 삭제 감지 불가
TriggerDB 트리거로 로그 테이블정확, DB 부하
Log-basedDB 트랜잭션 로그 분석정확, 구현 복잡
Diff이전/현재 비교범용, 느림

2. Transform (변환)

데이터를 목적에 맞게 정제하고 변환하는 단계임.

주요 변환 작업:

작업설명예시
정제 (Cleansing)오류/결측 처리NULL → 기본값
형식 변환데이터 타입, 포맷날짜 형식 통일
코드 매핑코드 → 값 변환’M’ → ‘남성’
집계합계, 평균 등일별 매출 합계
조인테이블 결합주문 + 고객
중복 제거Deduplication동일 레코드 제거
파생 컬럼계산된 값 생성나이 = 현재년 - 생년

3. Load (적재)

변환된 데이터를 목적지에 저장하는 단계임.

적재 방식설명용도
Full Load전체 삭제 후 재적재초기, 소규모
Incremental신규 데이터만 추가일반적
Upsert (Merge)있으면 UPDATE, 없으면 INSERTSCD 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

구분ETLELT
순서Extract → Transform → LoadExtract → Load → Transform
변환 위치별도 ETL 서버목적지 (DW/Data Lake)
적합 환경전통적 DW클라우드, 빅데이터
장점정제된 데이터만 적재원본 보존, 유연한 변환
단점ETL 서버 부하목적지 리소스 사용
도구 예시Informatica, ODISpark, 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 PowerCenterInformatica엔터프라이즈 표준, GUI 기반
Oracle ODIOracleOracle 환경 최적화
IBM DataStageIBM대규모 환경
TalendTalend오픈소스 버전 있음
SSISMicrosoftSQL Server 통합

오픈소스 / 클라우드

도구특징
Apache Airflow워크플로우 오케스트레이션 (Python)
Apache NiFi실시간 데이터 흐름, GUI
PrefectAirflow 대안, 현대적
Dagster데이터 자산 중심
AWS Glue서버리스 ETL
Azure Data FactoryAzure 통합
dbtSQL 기반 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

가장 많이 쓰이는 워크플로우 오케스트레이션 도구임.

핵심 개념:

개념설명
DAGDirected Acyclic Graph, 작업 흐름 정의
Task개별 작업 단위
OperatorTask 유형 (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과거 데이터 소급 처리

🔗 시리즈 네비게이션

시리즈 목차로 돌아가기