본문 바로가기
C.W.K.
Stream
Lesson 05 of 06 · published

Batch vs Streaming — 진짜 trade-off

~11 min · batch, streaming, architecture

Level 0구경꾼
0 XP0/47 lessons0/11 achievements
0/120 XP to next level120 XP to go0% complete

담론 vs 현실

컨퍼런스 무대만 보면 온 세상이 streaming 으로 넘어간 것 같지. 2026 현장의 현실은 데이터 엔지니어링 대부분이 여전히 batch 라는 거야 — 세련된 회사들도 비율로 치면 80/20 정도로 batch 가 우세해. 그러니까 어느 쪽이 진짜 필요한지 따지는 법부터.

Batch 가 사주는 것

  • 더 단순한 mental model — "파이프라인은 매일 새벽 3시에 돌아."
  • 더 싼 compute — 24/7 최악 부하가 아니라 daily peak 에 맞춰 cluster 를 잡으면 돼.
  • 더 쉬운 디버깅 — run 이 하나하나 구분되고, 로그가 있고, 성공했거나 실패했거나 둘 중 하나야.
  • 더 쉬운 backfill — "지난주 다시 돌려" 라는 말이 성립해.

Streaming 이 사주는 것

  • 더 낮은 latency — 이벤트가 끊김 없이 흐르고, downstream consumer 가 초나 분 안에 봐.
  • Always-on aggregation — fraud 탐지, 실시간 대시보드, 온라인 ML feature 서빙에 필요해.
  • Producer 와 consumer 의 분리 — Kafka/Pulsar 가 그 사이의 bus 가 돼 줘.

옳은 질문

"Consumer 한테 필요한 freshness SLA 가 뭐야?" 답이 "daily 면 돼" 면 batch. "5분이면 돼" 면 micro-batch (5분마다 도는 batch 작업). "sub-second" 면 그때 streaming 이야. 그리고 대부분의 consumer 는 "daily" 라고 답해. Streaming 은 진짜 필요할 때 진짜 이점을 주고 — 안 필요할 때는 진짜 비용만 물려 (운영 복잡도, 돈, 디버깅 난이도).

Code

Micro-batch — 대부분의 "streaming" 요구의 실용적 중간·python
# cron / Airflow / Dagster 로 5분마다 스케줄.
# 마지막 watermark 이후 모든 거 읽고 partitioned target 에 쓰기
import datetime as dt
from pathlib import Path
import pandas as pd

def micro_batch_run(window_minutes: int = 5) -> None:
    # utcnow() 말고 aware UTC 로. naive 시계는 watermark 가 이 머신의
    # offset 만큼 소리 없이 밀리는 경로야. Python 3.12 부터 deprecated 이기도 하고.
    now = dt.datetime.now(dt.timezone.utc)
    since = now - dt.timedelta(minutes=window_minutes)
    bucket = now.strftime('%Y/%m/%d/%H%M')

    df = fetch_events(since=since.isoformat(), until=now.isoformat())
    if df.empty:
        return

    target = Path(f'warehouse/events/{bucket}')
    target.mkdir(parents=True, exist_ok=True)
    df.to_parquet(target / 'part-0.parquet', index=False)

# 5분 cron 으로 돌리면 Kafka 없이 실용적 near-real-time

External links

Exercise

본인 환경의 진짜 데이터 consumer 셋 (대시보드, ML 모델, 재무 리포트) 에 대해 각각 실제로 필요한 freshness SLA 를 적어 — 솔직하게, 바라는 숫자 말고 필요한 숫자로. Batch / micro-batch / streaming 으로 분류해 봐. 답이 거의 항상 "batch 면 돼" 로 나온다는 걸 확인하게 될 거야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.