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