CS

SSE (Server-Sent Events)

baek-dev 2025. 2. 19. 18:54

**SSE(Server-Sent Events)**는 서버가 클라이언트에게 실시간으로 데이터를 푸시(Push)하는 기술임.

클라이언트는 HTTP 연결을 유지하면서 서버로부터 지속적인 이벤트를 받을 수 있음.

 

SSE는 WebSocket과 비슷하지만 단방향(서버 → 클라이언트) 통신에 최적화된 기술임.

 

📌 1. SSE(Server-Sent Events)란?

✅ SSE의 정의

 

“SSE는 서버에서 클라이언트로 실시간 이벤트를 전송하는 단방향 통신 기술이다.”

“HTTP 연결을 유지하면서 서버가 지속적으로 데이터를 보낼 수 있다.”

 

✅ SSE의 특징

서버 → 클라이언트 단방향 통신 (클라이언트 → 서버는 요청만 가능)

HTTP 기반 연결 (일반적인 HTTP 요청처럼 동작)

자동 재연결 지원 (연결이 끊어지면 자동으로 다시 연결)

텍스트 기반(Event Stream Format, UTF-8 인코딩)

브라우저 기본 지원 (EventSource API 사용)

 

📌 2. SSE vs WebSocket 비교

비교 항목 SSE (Server-Sent Events) WebSocket
통신 방식 단방향 (서버 → 클라이언트) 양방향 (서버 ↔ 클라이언트)
기반 기술 HTTP 기반 TCP 기반
자동 재연결 기본 지원 별도 구현 필요
브라우저 지원 대부분의 최신 브라우저 지원 대부분의 최신 브라우저 지원
프로토콜 text/event-stream (텍스트 기반) 바이너리(ws://) 또는 텍스트 기반
사용 예시 실시간 알림, 서버 이벤트, 채팅 메시지 수신 실시간 채팅, 온라인 게임, 양방향 데이터 스트리밍

 

언제 SSE를 사용할까?

실시간 뉴스, 알림(Notification), 실시간 업데이트 등 서버 → 클라이언트 전송이 필요한 경우

트래픽이 적고 가벼운 단방향 통신이 필요한 경우

 

언제 WebSocket을 사용할까?

채팅 애플리케이션, 온라인 게임처럼 클라이언트와 서버가 양방향으로 데이터를 주고받아야 하는 경우

고빈도 업데이트(주식 거래, 실시간 스포츠 점수 등)가 필요한 경우

 

📌 3. SSE 기본 예제

SSE는 브라우저의 EventSource 객체를 사용하여 구현 가능함.

 

✅ (1) 서버 구현 (Spring Boot)

 

Spring Boot에서 SSE를 이용해 실시간 데이터를 전송하는 API를 구현해보자.

@RestController
@RequestMapping("/sse")
public class SseController {
    
    private final SseEmitter emitter = new SseEmitter();

    @GetMapping("/subscribe")
    public SseEmitter subscribe() {
        return emitter;
    }

    @PostMapping("/send")
    public ResponseEntity<String> sendEvent(@RequestParam String message) {
        try {
            emitter.send(SseEmitter.event().name("message").data(message));
        } catch (IOException e) {
            emitter.complete();
        }
        return ResponseEntity.ok("Event sent");
    }
}

 

🔹 설명

SseEmitter 객체를 사용하여 클라이언트와 연결 유지

GET /sse/subscribe → 클라이언트가 SSE 이벤트를 구독

POST /sse/send?message=Hello → 서버에서 클라이언트로 메시지 전송

 

✅ (2) 클라이언트 구현 (JavaScript)

브라우저에서 EventSource API를 사용하면 SSE 연결을 쉽게 구현 가능함.

const eventSource = new EventSource("http://localhost:8080/sse/subscribe");

// 서버에서 메시지를 받을 때 실행되는 이벤트 리스너
eventSource.onmessage = function(event) {
    console.log("Received message:", event.data);
};

// 서버에서 특정 이벤트("message")를 받을 때 실행되는 이벤트 리스너
eventSource.addEventListener("message", function(event) {
    console.log("Event received:", event.data);
});

// 연결 종료 시 처리
eventSource.onerror = function() {
    console.log("SSE connection closed.");
    eventSource.close();
};

 

🔹 설명

new EventSource("서버_URL") → 서버와 SSE 연결을 생성

eventSource.onmessage → 기본 메시지를 수신할 때 실행

eventSource.addEventListener("이벤트_이름") → 특정 이벤트를 수신할 때 실행

연결이 끊어지면 자동으로 재연결됨 (SSE 기본 기능)

 

📌 4. SSE의 장점 & 단점

✅ (1) SSE의 장점

 

단순한 구현

HTTP 기반이므로 프록시, 로드 밸런서와 쉽게 연동 가능

브라우저에서 EventSource API로 쉽게 사용 가능

 

자동 재연결 지원

연결이 끊어지면 자동으로 재연결 (별도 로직 필요 없음)

 

HTTP/2와 함께 사용 가능

HTTP/2에서는 하나의 TCP 연결에서 여러 개의 SSE 스트림을 사용할 수 있어 성능이 향상됨

 

텍스트 스트리밍 최적화

UTF-8 기반 텍스트 스트리밍에 최적화됨 (JSON, XML 등)

 

❌ (2) SSE의 단점

 

양방향 통신 불가능

클라이언트 → 서버 데이터 전송은 별도로 구현해야 함 (fetch()나 WebSocket 필요)

 

동시 연결 수 제한

브라우저별 최대 연결 수 제한이 있음 (Chrome: 6개, Firefox: 6개, Safari: 6개)

대규모 사용자는 WebSocket이 더 적합할 수 있음

 

바이너리 데이터 전송 어려움

SSE는 **텍스트 기반(text/event-stream)**이므로, 바이너리 데이터(WebSocket보다 제한적)

 

📌 5. SSE를 실무에서 사용하는 예시

✅ (1) 실시간 알림(Notification) 시스템

서버에서 새로운 이벤트(예: 친구 요청, 메시지 도착 등)를 SSE를 통해 클라이언트에 전달

기존 폴링 방식보다 빠르고 효율적

 

✅ (2) 주식 가격 실시간 업데이트

서버에서 최신 주식 가격을 클라이언트로 지속적으로 전송

실시간 정보 업데이트를 위한 SSE 활용

 

✅ (3) 채팅 애플리케이션 (일방향)

서버에서 새로운 메시지를 클라이언트에 자동 전송 (읽기 전용)

WebSocket과 다르게 양방향이 필요하면 폴링(Fetch API)과 함께 사용 가능

 

✅ (4) 서버 상태 모니터링

서버 로그, CPU 사용량, 메모리 사용량 등의 실시간 정보를 SSE를 통해 전송

 

📌 6. SSE를 더 강력하게 사용하려면?

✅ (1) Redis Pub/Sub 연동 (분산 환경)

여러 서버가 존재하는 환경에서 Redis의 Pub/Sub을 활용하면, 모든 서버가 동일한 이벤트를 전송 가능

Spring Boot + Redis를 사용하면 SSE를 분산 환경에서도 활용할 수 있음.

 

✅ (2) HTTP/2와 함께 사용

HTTP/2는 하나의 연결에서 여러 개의 SSE 스트림을 처리할 수 있어 성능이 향상됨.

 

✅ (3) 클라이언트에서 SSE 메시지를 안전하게 처리

try-catch로 JSON 파싱 오류 등을 방지

메시지 타입을 체크하여 올바른 데이터만 처리

 

🚀 결론

SSE(Server-Sent Events)는 서버 → 클라이언트 단방향 데이터 스트리밍에 최적화된 기술

WebSocket보다 단순한 구조를 가지며, 자동 재연결 기능이 있어 편리함

실시간 알림, 뉴스 피드, 주식 가격 업데이트 등에 유용

양방향 통신이 필요하면 WebSocket을 고려해야 함

 

 

 

 

출처 : ChatGPT

'CS' 카테고리의 다른 글

JIT(Just-In-Time) 컴파일러  (0) 2025.03.05
트러블 슈팅  (0) 2025.02.28
락(Lock)과 동시성  (0) 2025.02.18
OCP 원칙 (Open-Closed Principle)  (0) 2025.02.17
다형성  (1) 2025.02.16