실시간 통신의 세 가지 방식: Polling, SSE, WebSocket 비교와 SSE의 활용
실시간 데이터 통신은 사용자 경험을 향상시키기 위한 핵심 기술 중 하나입니다. 특히 웹 애플리케이션에서는 클라이언트가 서버로부터 “실시간”으로 정보를 받아야 하는 경우가 많습니다. 대표적인 예는 다음과 같습니다.
- 실시간 알림
- 실시간 채팅
- 실시간 위치 추적
이러한 기능을 구현하기 위해 주로 사용되는 세 가지 방식이 있습니다:
- Polling (폴링)
- SSE (Server-Sent Events)
- WebSocket
이 세 가지 방식의 차이를 비교하고, SSE를 중심으로 어떤 상황에서 적합한지 구체적으로 살펴보겠습니다.
참고로 저는 이번 프로젝트에 실시간 위치 추적 기능을 구현하기 위해 SSE방식을 사용하였기에 SSE방식에 대해 더 알아보았습니다.
1. Polling 방식
Polling: 클라이언트가 일정 주기로 서버에 요청을 보내는 방식
Client ----> Server (데이터 요청)
Client <---- Server (응답)
... n초 후 반복
장점
- 구현이 간단하고 대부분의 서버/브라우저에서 지원됨
- HTTP 기반이므로 기존 인프라와 잘 어울림
단점
- 필요 없는 요청이 많아 네트워크 낭비
- 실시간성이 떨어짐 (응답은 항상 주기적으로만 수신 가능)
- 요청 간격을 줄이면 서버 부하가 증가함
2. Server-Sent Events (SSE)
SSE: HTTP 기반의 단방향 스트리밍 방식으로, 서버가 클라이언트에 데이터를 푸시(Push)할 수 있게 해줌
Client ----> Server (단일 요청)
Client <---- Server
...
Client <---- Server (스트리밍으로 지속적인 데이터 Push)
장점
- 서버에서 클라이언트로 실시간 데이터 전송 가능
- HTTP/1.1 기반이므로 프록시, 로드 밸런서와 호환성이 높음
- 자동 재연결 및 이벤트 ID 관리 등 기본 기능 내장
- 메시지 형식이 단순 (text/event-stream)
단점
- 단방향 통신만 가능 (클라이언트 → 서버 방향의 실시간 전송 불가)
- 브라우저 호환성 (IE/Edge 등 일부 구형 브라우저 미지원)
- 서버는 이벤트를 주기적으로 플러시해야 하며, 연결 수가 많을 경우 부하 고려 필요
예시 코드
Backend (Spring Boot 예시)
@GetMapping(value = "/subscribe", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public SseEmitter subscribe(@RequestParam Long userId) {
SseEmitter emitter = new SseEmitter();
emitters.put(userId, emitter);
// 서버에서 emitter.send(...)를 통해 데이터 전송 가능
return emitter;
}
Frontend (JavaScript 예시)
const eventSource = new EventSource("/subscribe?userId=123");
eventSource.addEventListener("message", (event) => {
const data = JSON.parse(event.data);
console.log("받은 데이터:", data);
});
3. WebSocket
WebSocket: HTTP 핸드셰이크 후, 양방향 통신이 가능한 프로토콜
Client ⇄ Server (Full Duplex 양방향 통신)
장점
- 완전한 양방향 통신 지원 (채팅, 협업 등)
- 통신 속도 및 실시간성 매우 뛰어남
- 오버헤드가 적음 (헤더가 작고 지속 연결 유지)
단점
- 초기 구현 및 관리 복잡도 있음
- HTTP와는 다른 프로토콜이므로 일부 네트워크 환경에서 문제 발생 가능
- 메시지 재연결 및 안정성 처리를 직접 구현해야 함
어떤 상황에서 SSE가 적합할까?
조건 | SSE 적합 여부 |
---|---|
서버 → 클라이언트 단방향 통신 | 매우 적합 |
브라우저 기반 웹 애플리케이션 | 적합 |
클라이언트가 많고 빈도는 낮은 실시간 알림 | 적합 |
클라이언트 → 서버로의 실시간 입력 필요 | WebSocket이 적합 |
모바일 네트워크 환경 | Polling 또는 WebSocket이 더 적합할 수 있음 |
정리
방식 | 연결 유지 | 방향 | 실시간성 | 구현 난이도 | 대표 사용 사례 |
---|---|---|---|---|---|
Polling | ❌ | 클 → 서 | 낮음 | 쉬움 | 간단한 상태 체크 |
SSE | ✅ | 서 → 클 | 높음 | 보통 | 실시간 알림, 모니터링 |
WebSocket | ✅ | 양방향 | 매우 높음 | 어려움 | 채팅, 게임, 협업툴 |
마무리
SSE는 “적절한 실시간성이 필요한 상황”에서 간단하고 안정적인 방법을 제공합니다.
모든 상황에서 WebSocket이 정답은 아니며, 서버에서만 데이터를 보내는 구조라면
SSE는 구현 난이도와 성능 측면 모두에서 훌륭한 선택이 될 수 있습니다.
실시간 서비스에 적절한 기술을 선택하는 것이 중요하며,
서비스의 목적, 규모, 요구사항에 따라 Polling, SSE, WebSocket 중 적절한 방식을 고려해보세요!