SSE

서버가 클라이언트에게 HTTP 연결을 유지하며 단방향으로 이벤트를 스트리밍하는 기술입니다 (Server-Sent Events).

핵심 특징

이벤트 스트림 형식

data: {"message": "처리 중..."}

data: {"message": "완료"}
id: 42
event: done
retry: 3000

빈 줄(\n\n)이 이벤트 구분자. data:, id:, event:, retry: 필드 사용.

Spring MVC — SseEmitter

@GetMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public SseEmitter stream() {
    SseEmitter emitter = new SseEmitter(30_000L);  // 30초 타임아웃

    executorService.submit(() -> {
        try {
            for (int i = 0; i < 5; i++) {
                emitter.send(SseEmitter.event()
                    .id(String.valueOf(i))
                    .data("chunk " + i));
                Thread.sleep(500);
            }
            emitter.complete();
        } catch (Exception e) {
            emitter.completeWithError(e);
        }
    });

    return emitter;
}

Spring WebFlux — Flux

@GetMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<ServerSentEvent<String>> stream() {
    return Flux.interval(Duration.ofMillis(500))
        .take(5)
        .map(i -> ServerSentEvent.<String>builder()
            .id(String.valueOf(i))
            .data("chunk " + i)
            .build());
}

클라이언트 (JavaScript)

const es = new EventSource('/stream');

es.onmessage = (e) => console.log(e.data);
es.addEventListener('done', (e) => es.close());
es.onerror = () => es.close();

SSE vs WebSocket vs Polling

SSEWebSocketLong Polling
방향단방향 (서버→클라이언트)양방향단방향
프로토콜HTTPWS (업그레이드)HTTP
재연결자동직접 구현직접 구현
헤더 오버헤드최초 1회최초 1회매 요청마다
사용 예AI 응답 스트리밍, 알림 피드채팅, 게임알림 (레거시)

주의사항

핵심 정리

→ Spring WebFlux | WebSocket

CSLOG에서 보기