핵심 인사이트 (3줄 요약)

  • 본질: 윈도우 연산(Window Operations)은 무한한 스트림 데이터를 유한한 집합으로 나누어 집계·분석하는 스트리밍의 핵심 메커니즘으로, 시간 기반(Tumbling·Sliding·Session)과 카운트 기반 윈도우가 있으며 이벤트 시간과 처리 시간 모두에 적용된다.
  • 가치: 윈도우 없이는 "지난 5분간의 평균 거래금액", "1시간 내 3회 이상 로그인 실패" 같은 시간 범위 기반 집계가 불가능하며, 각 윈도우 유형의 특성이 다르므로 비즈니스 요구에 맞는 유형 선택이 쿼리 정확도와 성능을 결정한다.
  • 판단 포인트: 텀블링(Tumbling)은 겹치지 않아 단순하고 효율적이나 경계 직전/직후의 이벤트가 다른 집계에 들어간다. 슬라이딩(Sliding)은 더 부드러운 결과를 주지만 이벤트가 여러 윈도우에 중복 포함되어 메모리 비용이 크기/슬라이드 배 증가한다.

Ⅰ. 개요 및 필요성

1. 왜 윈도우가 필요한가

무한 스트림에서 집계를 수행하려면 "집계할 범위"가 있어야 한다.

무한 이벤트 스트림: ─────────────────────────────────→ (끝이 없음)
                    E1 E2 E3 E4 E5 E6 E7 E8 E9 E10...

"지난 5분 합계"를 구하려면 → 5분이라는 경계(윈도우)가 필요
"5분마다 집계" → 텀블링 윈도우
"1분마다 갱신되는 5분 이동평균" → 슬라이딩 윈도우
"사용자 활동 세션 내 집계" → 세션 윈도우

📢 섹션 요약 비유

윈도우는 "흐르는 강물에서 물을 퍼내는 양동이"다. 양동이 없이 강물의 양을 재는 것은 불가능하다. 양동이 크기(윈도우 크기)와 퍼내는 주기(슬라이드)를 어떻게 설계하느냐에 따라 측정 방식이 달라진다.


Ⅱ. 아키텍처 및 핵심 원리

1. 네 가지 윈도우 유형 시각화

[텀블링 윈도우 (Tumbling Window) - 크기=5분, 슬라이드 없음]
 W1        W2        W3
┌────────┐ ┌────────┐ ┌────────┐
│00─────05│ │05─────10│ │10─────15│
└────────┘ └────────┘ └────────┘
겹침 없음, 각 이벤트는 정확히 1개 윈도우에 속함

[슬라이딩 윈도우 (Sliding Window) - 크기=10분, 슬라이드=5분]
 W1              W2              W3
┌───────────────┐               │
│00──────────10 │               │
└───────────────┘               │
       ┌───────────────┐        │
       │05────────────15        │
       └───────────────┘        │
겹침 발생, 이벤트가 여러 윈도우에 중복 포함 가능

[세션 윈도우 (Session Window) - 갭 타임아웃=5분]
 세션1       세션2     세션3
┌─────────┐  ┌──────┐  ┌──────┐
│E1 E2 E3 │  │E5 E6 │  │E8 E9 │
└─────────┘  └──────┘  └──────┘
     5분↑         5분↑
  (활동 간격   (활동 간격
   5분 이상    5분 이상
   → 분리)     → 분리)
// 1. 텀블링 윈도우
stream.keyBy(e -> e.getUserId())
      .window(TumblingEventTimeWindows.of(Time.minutes(5)))
      .sum("amount");

// 2. 슬라이딩 윈도우
stream.keyBy(e -> e.getUserId())
      .window(SlidingEventTimeWindows.of(Time.minutes(10), Time.minutes(5)))
      .average("amount");

// 3. 세션 윈도우
stream.keyBy(e -> e.getUserId())
      .window(EventTimeSessionWindows.withGap(Time.minutes(5)))
      .count();

// 4. 글로벌 윈도우 (커스텀 트리거 필요)
stream.keyBy(e -> e.getUserId())
      .window(GlobalWindows.create())
      .trigger(CountTrigger.of(100))   // 100개 이벤트마다 트리거
      .sum("amount");

3. 윈도우 유형 비교

유형겹침크기메모리 비용적합 사례
텀블링 (Tumbling)없음고정낮음시간별 집계, 일별 통계
슬라이딩 (Sliding)있음고정 (크기 > 슬라이드)높음 (크기/슬라이드 배)이동 평균, 트렌드 분석
세션 (Session)없음동적 (활동 기반)보통사용자 세션 분석
글로벌 (Global)없음무한매우 높음카운트 기반 트리거

📢 섹션 요약 비유

텀블링은 "1시간짜리 수업 교시(겹침 없음)", 슬라이딩은 "2시간짜리 이동 수업(1시간마다 시작, 겹침 있음)", 세션은 "학생이 공부를 시작~멈추는 한 세션"이다. 세션 윈도우는 크기가 고정되어 있지 않고 사용자 행동에 따라 달라진다.


Ⅲ. 비교 및 연결

1. 윈도우 트리거(Trigger)와 이빅터(Evictor)

  • 트리거(Trigger): 윈도우 함수를 언제 실행할지 결정

    • EventTimeTrigger: 워터마크가 윈도우 끝을 초과할 때 (기본)
    • ProcessingTimeTrigger: 처리 시간 기준
    • CountTrigger: N개 이벤트마다
  • 이빅터(Evictor): 함수 실행 전/후 이벤트 제거

    • CountEvictor: 최근 N개만 유지
    • TimeEvictor: 최근 N초만 유지

2. 윈도우 Join (스트림 간 조인)

// 같은 시간 윈도우 내에서 두 스트림 조인
orders.join(deliveries)
      .where(o -> o.getOrderId())
      .equalTo(d -> d.getOrderId())
      .window(TumblingEventTimeWindows.of(Time.hours(1)))
      .apply((order, delivery) -> new OrderDelivery(order, delivery));

📢 섹션 요약 비유

윈도우 조인은 "같은 수업(윈도우)에 있는 학생들을 짝 지어주는 것"이다. 같은 시간대(윈도우)에 수업에 있었던 학생(이벤트)들끼리만 조인이 가능하다.


Ⅳ. 실무 적용 및 기술사 판단

1. 윈도우 유형 선택 가이드

비즈니스 요구사항권장 윈도우
5분마다 집계 리포트텀블링 (5분)
실시간 1분 이동평균 (5분 범위)슬라이딩 (5분, 1분)
사용자 세션별 총 구매금액세션 (갭 30분)
이상 패턴: 3번 연속 실패카운트 기반 글로벌 윈도우 + CountTrigger

2. 슬라이딩 윈도우 성능 주의

슬라이딩 윈도우에서 크기=60분, 슬라이드=1분이면 각 이벤트가 60개 윈도우에 중복 포함된다. 이는 메모리 60배 증가를 의미한다.

메모리 비용 = 이벤트 수 × (윈도우 크기 / 슬라이드 간격)
= 1000만 이벤트 × (60분 / 1분) = 6억 개 분량 → 위험!

해결책: 집계함수(SUM, COUNT)는 증분 집계(Incremental Aggregation)를 사용하여 중간 상태만 저장.

📢 섹션 요약 비유

슬라이딩 윈도우의 메모리 비용은 "여러 교시 동시 수업에 같은 학생이 중복 출석"하는 것과 같다. 60교시에 같은 학생이 있으면 출석부가 60배 두꺼워진다. 집계 함수를 쓰면 출석부 대신 "각 교시 출석 인원수"만 기록해서 메모리를 절약한다.


Ⅴ. 기대효과 및 결론

1. 기대효과

윈도우 유형기대 효과
텀블링정기적 집계 자동화, 낮은 메모리 비용
슬라이딩부드러운 이동 통계, 실시간 트렌드 파악
세션사용자 행동 컨텍스트 보존, 비즈니스 세션 단위 분석

2. 결론

윈도우 연산은 스트리밍 집계의 기본 문법이다. 기술사 답안에서는 네 가지 윈도우 유형의 특성과 차이점을 시각적으로 설명하고, 이벤트 시간 기반 윈도우와 워터마크의 연결, 슬라이딩 윈도우의 메모리 트레이드오프를 함께 서술하는 것이 핵심이다.

📢 섹션 요약 비유

윈도우 연산은 "흐르는 강물을 사진 찍는 방법"이다. 텀블링은 "5초마다 찍는 연속 사진(겹침 없음)", 슬라이딩은 "1초마다 찍되 5초짜리 노출로 찍는 사진(겹침 있음)", 세션은 "일몰부터 일출까지 찍는 타임랩스(자연 경계)" — 각각 다른 정보를 담는다.


📌 관련 개념 맵

개념관계설명
Watermark윈도우 트리거워터마크가 윈도우 끝에 도달하면 윈도우 닫힘
Event Time기반 시간이벤트 시간 기준 윈도우 정확도 향상
Trigger윈도우 제어윈도우 실행 시점 결정
State Backend상태 저장슬라이딩 윈도우 상태는 RocksDB 권장
CEP응용세션 윈도우 패턴의 복합 이벤트 감지

📈 관련 키워드 및 발전 흐름도

[무한 스트림 (Unbounded Stream) — 실시간 이벤트 연속 발생]
    │
    ▼
[윈도우 할당 (Window Assignment) — 텀블링·슬라이딩·세션 윈도우로 시간 범위 구획]
    │
    ▼
[워터마크 (Watermark) — 지연 도착 이벤트 허용 범위 설정]
    │
    ▼
[윈도우 집계 (Window Aggregation) — 구획 내 합산·평균·카운트 계산]
    │
    ▼
[결과 출력 (Trigger & Output) — 윈도우 완료 시 싱크(Sink)에 결과 방출]

이 흐름은 무한 스트림을 유한 윈도우로 구획하고 집계·출력하는 스트리밍 처리 파이프라인을 나타낸다.

👶 어린이를 위한 3줄 비유 설명

물고기를 잡을 때 그물(윈도우)의 모양이 중요해요. 텀블링 그물은 5분마다 새 그물로 교체해서 물고기가 두 그물에 걸리지 않고, 슬라이딩 그물은 1분마다 앞으로 당기면서 최근 5분 물고기를 항상 보여주고, 세션 그물은 물고기가 몰릴 때 벌어지고 5분 동안 물고기가 없으면 닫혀요. 어떤 그물을 쓰느냐에 따라 잡히는 물고기 수가 달라진답니다!