스트림 처리 (Stream Processing)
목차
- 왜 스트림 처리를 묻는가
- 스트림 처리란
- 배치 처리와 스트림 처리의 차이
- Event Time과 Processing Time
- Window와 Watermark
- Stateful Processing이 중요한 이유
- Spark와 Flink를 어떻게 비교할까
- Kafka Consumer로 충분한 경우와 아닌 경우
- 운영에서 자주 나오는 포인트
- 면접 포인트
- 참고 자료
왜 스트림 처리를 묻는가
면접에서 스트림 처리를 묻는 이유는 단순히 “Kafka를 써봤는가”를 보려는 것이 아닙니다.
보통 다음을 확인하려는 경우가 많습니다.
- 시간 개념 이해: 이벤트가 늦게 도착하면 집계를 어떻게 다룰 것인가
- 상태 관리 이해: 실시간 집계, deduplication, 세션 계산을 어떻게 유지할 것인가
- 처리 모델 이해: 배치와 스트림이 무엇이 다른지 설명할 수 있는가
- 도구 선택 감각: Kafka consumer면 충분한지, Spark나 Flink 같은 엔진이 필요한지 판단할 수 있는가
이 문서는 분산 처리 엔진과 운영 모델에 초점을 둡니다.
메시징 일반론은 메시징 시스템 (Messaging System), Kafka 심화는 Kafka (Apache Kafka) 문서와 같이 보면 좋습니다.
스트림 처리란
스트림 처리(Stream Processing) 는 끝이 정해지지 않은 이벤트 흐름을 지속적으로 읽고 가공하는 처리 모델입니다.
대표 예시는 다음과 같습니다.
- 클릭 로그 실시간 집계
- 결제 이상 탐지
- 실시간 추천 피처 계산
- IoT 센서 데이터 모니터링
중요한 점은 스트림 처리가 “메시지를 읽는다”에서 끝나지 않는다는 점입니다.
- 상태를 유지해야 할 수 있음
- 늦게 온 데이터를 반영해야 할 수 있음
- 집계 결과를 지속적으로 갱신해야 할 수 있음
- 장애 후 재처리와 복구를 고려해야 함
즉, 스트림 처리는
이벤트를 연속적으로 읽으면서 시간과 상태를 함께 다루는 계산 모델이라고 설명하는 편이 좋습니다.
배치 처리와 스트림 처리의 차이
| 항목 | 배치 처리 | 스트림 처리 |
|---|---|---|
| 입력 | 유한한 데이터셋 | 끝이 정해지지 않은 이벤트 흐름 |
| 실행 감각 | 정해진 시점에 한 번 실행 | 지속적으로 실행 |
| 지연 시간 | 분~시간 단위도 허용 가능 | 초~밀리초 단위가 중요할 수 있음 |
| 주 관심사 | 처리량, 비용, 전체 재계산 | 지연, 상태, late event, 복구 |
| 대표 예시 | 일별 정산, 백필, 리포트 생성 | 실시간 알림, 이상 탐지, 실시간 집계 |
면접에서는 둘을 완전히 반대 개념처럼 설명하기보다,
같은 문제를 다른 freshness 요구사항으로 푸는 방식이라고 설명하면 더 좋습니다.
예를 들어:
- 하루 뒤에 봐도 되는 매출 집계는 배치 처리로 충분할 수 있음
- 초 단위로 변하는 대시보드는 스트림 처리가 더 자연스러울 수 있음
즉, 스트림 처리는 “더 고급”이라기보다
낮은 지연과 지속적 계산이 필요한 경우의 선택지입니다.
Event Time과 Processing Time
스트림 처리에서 가장 자주 나오는 개념이 시간입니다.
- Event Time: 이벤트가 실제로 발생한 시각
- Processing Time: 시스템이 이벤트를 처리한 시각
이 둘을 구분해야 하는 이유는 이벤트가 늦게 도착할 수 있기 때문입니다.
예를 들어 사용자가 10:00:05에 클릭했지만, 네트워크 지연 때문에 10:00:20에 도착할 수 있습니다.
- event time 기준 집계: 10:00:05 구간에 반영
- processing time 기준 집계: 10:00:20에 도착한 것으로 처리
좋은 답변은 다음처럼 정리됩니다.
- event time: 비즈니스적으로 더 자연스러운 시간 기준
- processing time: 구현이 단순하지만 지연과 순서 뒤틀림에 취약할 수 있음
실시간 분석이나 과금처럼 시간 정합성이 중요하면
보통 event time 개념을 함께 설명하는 편이 좋습니다.12
Window와 Watermark
스트림은 끝이 없기 때문에 “언제 집계를 끊을지”를 정해야 합니다.
그래서 window 개념이 필요합니다.
- Tumbling Window: 겹치지 않는 고정 길이 구간
- Sliding Window: 일정 간격으로 겹치며 이동하는 구간
- Session Window: 사용자 활동 간격이 끊길 때 세션 경계를 두는 구간
문제는 늦게 도착한 이벤트입니다. 여기서 watermark 가 등장합니다.
watermark는 대략적으로
“이 시점 이전 이벤트는 웬만하면 다 왔다고 보고 창(window)을 닫겠다”는 기준입니다.32
이 개념을 설명할 때 중요한 포인트는 다음입니다.
- 장점: late event를 어느 정도 반영하면서도 결과를 마무리할 수 있습니다.
- 장점: 무한히 기다리지 않고 상태 크기를 제한할 수 있습니다.
- 단점: watermark를 너무 짧게 잡으면 늦은 이벤트를 놓칠 수 있습니다.
- 단점: 너무 길게 잡으면 결과 확정이 늦고 상태가 커집니다.
즉, watermark는 정답 공식이 아니라
정확도와 지연 사이의 운영 기준입니다.
Stateful Processing이 중요한 이유
스트림 처리가 어려운 이유는 단순 필터링보다 상태(state) 가 필요한 연산이 많기 때문입니다.
대표 예시는 다음과 같습니다.
- 최근 10분 클릭 수 집계
- 사용자 세션 계산
- 중복 이벤트 제거
- 이상 탐지를 위한 최근 패턴 유지
이런 연산은 이벤트 하나만 보고는 계산이 끝나지 않습니다.
이전 이벤트들의 맥락을 상태로 유지해야 합니다.
그래서 스트림 엔진은 보통 다음 능력이 중요합니다.
- 상태 저장: 연산 중간 상태를 유지
- 체크포인트/복구: 장애 후 상태를 복원
- 재처리 감각: 다시 읽어도 결과가 크게 틀어지지 않게 설계
여기서 exactly-once라는 말을 너무 쉽게 쓰면 안 됩니다.
- 엔진 내부의 상태 일관성
- sink까지 포함한 end-to-end 결과 일관성
- 애플리케이션 중복 흡수 설계
이 셋은 같은 말이 아닙니다.
좋은 답변은 “엔진이 알아서 해준다”가 아니라
상태, 체크포인트, sink semantics, idempotency를 함께 봐야 한다고 설명하는 편이 더 실무적입니다.
Spark와 Flink를 어떻게 비교할까
두 엔진 모두 배치와 스트림을 함께 다룰 수 있지만, 면접에서는 출발점이 다르다는 점을 말하면 충분합니다.
| 항목 | Spark | Flink |
|---|---|---|
| 기본 인상 | 분석/배치 경험에서 확장된 엔진 | stateful stream processing 중심 엔진 |
| 강한 지점 | Spark SQL, 배치, ETL, 데이터 생태계 연계 | event time, state, 낮은 지연, 장기 실행 작업 |
| 설명 포인트 | Structured Streaming으로 일관된 분석 모델 제공 | stateful computations와 event-time 처리에 강점 |
| 잘 맞는 경우 | 배치와 스트림을 하나의 분석 스택에서 묶고 싶을 때 | 실시간 상태 처리와 정교한 시간 제어가 중요할 때 |
면접에서 너무 단정적으로 “Spark는 배치, Flink는 스트림”이라고 말하면 약간 거칠 수 있습니다.
더 좋은 설명은 다음입니다.
즉, 둘의 차이는 기능 유무보다
어떤 처리 모델과 운영 감각을 더 중심에 두는가에 가깝습니다.
Kafka Consumer로 충분한 경우와 아닌 경우
모든 실시간 처리가 별도 스트림 엔진을 필요로 하지는 않습니다.
Kafka consumer와 애플리케이션 코드만으로 충분한 경우도 많습니다.
Kafka Consumer로 충분한 경우
- 단순 이벤트 변환
- 외부 API 호출 후 저장
- 비교적 짧은 상태만 필요한 업무 로직
- 파티션 단위 순서와 at-least-once 정도로 충분한 경우
별도 스트림 엔진이 더 자연스러운 경우
- 복잡한 window 집계가 필요함
- event time과 late event 처리가 중요함
- 장시간 상태 유지가 필요함
- 여러 스트림 join이나 enrichment가 필요함
- 대규모 재처리와 운영 복구가 잦음
좋은 답변은
“데이터가 Kafka에 있으니 무조건 Flink를 쓴다”가 아니라,
상태, 시간, 재처리, 운영 난이도가 consumer 코드 수준을 넘는지로 판단하는 편이 좋습니다.
운영에서 자주 나오는 포인트
- Backpressure: 입력 속도를 처리량이 못 따라가면 지연이 계속 누적됩니다.
- State 크기: window와 key 수가 커지면 상태 저장 비용이 빠르게 증가합니다.
- Late Event: watermark 기준이 짧으면 정확도가 떨어지고, 길면 결과 확정이 늦어집니다.
- Checkpoint 비용: 너무 잦으면 성능이 떨어지고, 너무 드물면 복구 비용이 커집니다.
- Sink 일관성: DB, object storage, 외부 API로 내보낼 때 중복과 부분 실패를 흡수해야 합니다.
실무형 답변은 엔진 이름보다
운영에서 어떤 지표와 실패 모델을 볼 것인가까지 들어가는 편이 더 강합니다.
배치와 워크플로우 오케스트레이션은 작업 스케줄링과 워크플로우 (Job Scheduling and Workflows) 문서와 연결해 설명하면 좋습니다.
면접 포인트
- 스트림 처리는 이벤트를 계속 읽으면서 시간과 상태를 함께 다루는 계산 모델입니다.
- 배치와 스트림의 차이는 기술 유행보다 freshness 요구사항과 운영 모델의 차이로 설명하는 편이 좋습니다.
- event time, processing time, watermark를 구분할 수 있어야 합니다.
- window 집계와 stateful processing이 스트림 엔진 도입 이유인 경우가 많습니다.
- Spark와 Flink는 둘 다 배치/스트림을 다루지만, 출발하는 처리 모델과 운영 감각이 다릅니다.
- 단순 consumer로 충분한지, 별도 스트림 엔진이 필요한지는 상태·시간·재처리 복잡도로 판단하는 편이 안전합니다.