실시간 통신의 세 가지 방식: Polling, SSE, WebSocket 비교와 SSE의 활용

실시간 데이터 통신은 사용자 경험을 향상시키기 위한 핵심 기술 중 하나입니다. 특히 웹 애플리케이션에서는 클라이언트가 서버로부터 “실시간”으로 정보를 받아야 하는 경우가 많습니다. 대표적인 예는 다음과 같습니다.

  • 실시간 알림
  • 실시간 채팅
  • 실시간 위치 추적

이러한 기능을 구현하기 위해 주로 사용되는 세 가지 방식이 있습니다:

  1. Polling (폴링)
  2. SSE (Server-Sent Events)
  3. 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 중 적절한 방식을 고려해보세요!