ETC/Network

[Network] SSE (Server Sent Event) 란?

장쫄깃 2024. 12. 18. 19:30
728x90

SSE (Server Sent Event) 란?


 

SSE(Server-Sent Events)는 웹 클라이언트(브라우저)와 서버 간에 단방향 실시간 통신을 가능하게 하는 표준 기술이다. 클라이언트가 서버에 연결을 설정하면, 서버는 이벤트를 지속적으로 보내고 클라이언트는 이를 수신할 수 있다.

 

SSE는 HTML5 표준의 일부로 정의되었으며, 서버에서 클라이언트로 푸시(Push) 데이터를 보내는 데 사용된다. REST API와는 다르게 서버가 클라이언트 요청 없이도 필요한 데이터를 실시간으로 보낼 수 있다는 점이 주요 특징이다.

 

 

SSE의 주요 특징


  1. 단방향 통신
    1. 서버에서 클라이언트로만 데이터가 전달 (단방향)
  2. 기술 표준
    1. HTTP 프로토콜을 기반으로 동작
    2. 'Content-Type' 헤더에 'text/event-stream'을 사용
  3. 자동 재연결
    1. 연결이 끊어지면 브라우저가 기본적으로 연결을 자동으로 다시 시도
  4. 쉽고 가벼움
    1. WebSocket처럼 복잡한 핸드셰이크 과정이 필요하지 않고, HTTP를 기반으로 동작하므로 상대적으로 구현이 간단
  5. 브라우저 호환성
    1. 대부분의 최신 브라우저에서 지원
    2. Internet Explorer에서는 기본적으로 지원 X
  6. 단일 연결
    1. 클라이언트와 서버 간 하나의 HTTP 연결을 통해 여러 이벤트를 스트리밍

 

 

SSE 데이터 전송 예시


클라이언트 (JavaScript)

const eventSource = new EventSource('/sse-endpoint');

eventSource.onmessage = (event) => {
    console.log('수신 메시지:', event.data);
};

eventSource.onerror = () => {
    console.log('SSE 통신 중 오류 발생');
};

 

서버 (Spring Boot)

@RestController
@RequestMapping("/sse-endpoint")
public class SSEController {

    @GetMapping(produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux<String> streamEvents() {
        return Flux.interval(Duration.ofSeconds(1))
                   .map(sequence -> "Event #" + sequence);
    }
}

 

 

SSE vs WebSocket 비교


특징 SSE WebSocket
통신 방식 단방향 (서버 → 클라이언트) 양방향 통신 (서버 ↔ 클라이언트)
프로토콜 HTTP WebSocket
재연결 지원 브라우저에서 자동 지원 수동으로 구현 필요
구현 난이도 간단 비교적 복잡
브라우저 지원 대부분 지원 (IE 제외) 구형 브라우저나 특정 환경에서는 지원이 제한
사용 사례 실시간 알림, 로그 업데이트 등 채팅, 온라인 게임, 실시간 협업 도구

 

 

SSE의 장단점


장점

  • 간단하고 가벼운 구조
  • HTTP 기반이므로, 기존 인프라와 호환성이 좋음
  • 브라우저에서 기본적으로 지원하는 재연결 및 에러 핸들링

단점

  • 클라이언트 - 서버 간 단방향 통신만 가능
  • HTTP/2 환경에서 여러 클라이언트가 연결을 맺으면 리소스 소모가 많아질 수 있음
  • IE에서 지원되지 않음

SSE는 클라이언트마다 별도의 지속적인 연결을 유지하기 때문에, 클라이언트 수가 많아질수록 서버가 연결을 관리하는 리소스(CPU, 메모리, 네트워크)를 더 많이 사용한다.

HTTP/2는 멀티플렉싱을 지원하지만, SSE는 각 클라이언트에 독립적인 스트림을 사용하므로 연결 유지 비용과 네트워크 부하가 늘어난다. 특히 Keep-alive와 데이터 전송량 증가로 인해 서버 부하가 심해질 수 있다.

대규모 환경에서는 WebSocket 같은 방식이 적합하다.

 

 

정리하며


SSE구현이 간단하면서도 실시간 알림과 같은 특정 사용 사례에 적합하다. 만약 더 복잡한 양방향 통신이 필요하다면 WebSocket이 적합하다.

 

728x90