이 문서는 클라이언트-서버 간 실시간 데이터 통신을 위한 주요 기술인 Polling, Long Polling, SSE(Server-Sent Events), WebSocket을 비교하고, 특정 시나리오(1500개 동시 연결 및 방송)에 가장 적합한 기술을 분석합니다.


1. 기본 기술 비교 (Polling vs Long Polling vs SSE)

클라이언트가 서버로부터 최신 정보를 받아오기 위한 세 가지 기본적인 접근 방식입니다.

기술별 동작 방식

1. Polling (폴링)

  • 동작 방식: 클라이언트가 일정한 주기로 서버에게 “새로운 데이터 있어?”라고 계속해서 물어보는 방식입니다.
  • 장점: 구현이 매우 간단하고 직관적입니다.
  • 단점: 불필요한 요청이 많아 비효율적이며, 데이터 수신에 지연이 발생할 수 있습니다.

2. Long Polling (롱 폴링)

  • 동작 방식: 클라이언트가 요청을 보내면, 서버는 새로운 데이터가 생길 때까지 응답을 대기시킵니다. 데이터가 생기면 응답하고, 클라이언트는 즉시 다음 요청을 보내 다시 대기합니다.
  • 장점: 폴링보다 효율적이고 실시간에 가깝습니다.
  • 단점: 요청마다 연결을 새로 맺는 오버헤드가 발생합니다.

3. SSE (Server-Sent Events)

  • 동작 방식: 클라이언트가 서버에 최초 한 번의 연결을 맺으면, 그 연결을 계속 유지하면서 서버가 필요할 때마다 일방적으로 클라이언트에게 데이터를 밀어넣는(Push) 방식입니다.
  • 장점: 한 번의 연결로 오버헤드가 적고 매우 효율적입니다. EventSource API는 자동 재연결도 지원합니다.
  • 단점: 서버에서 클라이언트로의 단방향 통신만 가능합니다.

비교 요약표

구분PollingLong PollingSSE (Server-Sent Events)
연결 방식요청마다 연결/종료 반복요청마다 연결, 데이터 수신 후 종료최초 1회 연결 후 유지
통신 방향클라이언트 서버클라이언트 서버서버 클라이언트 (단방향)
지연 시간김 (최대 폴링 주기)짧음매우 짧음 (실시간)
효율성낮음 (불필요한 요청 많음)보통높음 (오버헤드 적음)
주요 용도실시간성이 중요하지 않은 경우실시간 채팅, 알림실시간 알림, 주식 시세, 라이브 스코어 등

2. 시나리오 분석: 1500개 동시 연결 및 전체 방송

요구사항: 1500개의 클라이언트가 동시에 연결되어야 하며, 변경 사항이 발생하면 모든 클라이언트에게 데이터를 전송(Broadcast)해야 합니다.

이 시나리오에서는 WebSocket이 가장 효율적이고 적합한 선택입니다.

기술별 적합성 평가

항목WebSocketSSE (Server-Sent Events)Long Polling
1500 연결 확장성매우 높음보통 (브라우저 제한 고려)매우 낮음
방송 효율성매우 높음높음낮음 (Thundering Herd 문제)
서버 리소스 사용량낮음보통매우 높음
통신 방향양방향단방향 (서버→클라이언트)양방향 (비효율적)
추천 여부강력 추천차선책절대 비추천
  • WebSocket (강력 추천): 적은 리소스로 수천 개의 동시 연결을 안정적으로 관리할 수 있습니다. 서버는 연결된 소켓 목록을 통해 매우 빠르고 효율적으로 방송할 수 있습니다. 양방향 통신이 가능해 향후 확장에도 유리합니다.
  • SSE (차선책): 1500개의 HTTP 연결을 유지하는 것은 WebSocket보다 리소스 소모가 크며, 브라우저의 도메인당 동시 연결 개수(약 6개) 제한이 심각한 제약이 될 수 있습니다.
  • Long Polling (절대 비추천): 1500개의 요청이 동시에 응답을 받고, 즉시 1500개의 새로운 요청이 몰려오는 “Thundering Herd” 문제로 서버에 엄청난 부하를 유발하여 시스템 장애로 이어질 수 있습니다.

3. 심층 분석: SSE vs WebSocket 리소스 사용량

“SSE가 WebSocket보다 리소스 사용량이 적다”는 주장은 특정 관점에서만 사실이며, 대규모 동시 접속 환경에서는 오해를 유발할 수 있습니다.

오해의 근원: 유휴(Idle) 연결 관리

  • 데이터 전송이 거의 없는 유휴 상태의 단일 연결만 놓고 보면, SSE가 더 가볍게 보일 수 있습니다. SSE는 본질적으로 긴 HTTP 요청 하나이며, 비동기 서버에서 유휴 연결은 거의 리소스를 차지하지 않기 때문입니다. 반면 WebSocket은 상태(Stateful)를 유지하기 위한 관리 비용이 미세하게 더 듭니다.

진실: 실제 데이터 전송 시의 효율성

대규모 데이터 전송 및 방송 환경에서는 프로토콜 오버헤드가 성능을 좌우하며, 이 지점에서 효율성이 역전됩니다.

  • SSE: 메시지를 보낼 때마다 `data: <메시지>

` 형식의 텍스트 기반 HTTP 청크로 전송됩니다. 이 형식 변환 자체가 오버헤드입니다.

  • WebSocket: 최초 핸드셰이크 후에는 매우 가벼운 바이너리 기반 프레이밍(Framing) 프로토콜을 사용합니다. 메시지에 붙는 헤더가 최소 2바이트까지 작아질 수 있어 오버헤드가 압도적으로 낮습니다.

최종 결론: 시나리오에 따른 리소스 사용량

비교 항목SSE (Server-Sent Events)WebSocket설명
유휴 연결 비용약간 더 낮을 수 있음약간 더 높을 수 있음단일 유휴 연결의 상태 관리 비용 측면. 현대 서버에선 거의 무의미한 차이.
메시지 전송 오버헤드높음 (텍스트 기반)매우 낮음 (바이너리 기반)실제 성능을 좌우하는 가장 중요한 요소.
1500개 방송 효율성낮음매우 높음낮은 오버헤드 덕분에 CPU와 네트워크 자원을 훨씬 적게 사용.
전체 리소스 사용량 (대규모 방송 시나리오 기준)높음낮음데이터 전송이 잦은 대규모 환경에서는 WebSocket이 압도적으로 효율적.

결론적으로, 1500개 연결과 같은 대규모 동시 접속 및 방송이 필요한 실시간 서비스에서는 프로토콜의 근본적인 효율성 차이로 인해 WebSocket이 SSE보다 훨씬 적은 리소스를 사용하며 안정적이고 확장성 있는 솔루션입니다.