폴링 vs WebSocket vs SSE
2026.10.01 · 4분
1. 가장 큰 차이: 누가 먼저 말을 거는가
text
폴링: 클라이언트 ── 있어요? ──> 서버 (계속 반복해서 물어봄)
SSE: 클라이언트 <── 새 소식 ── 서버 (연결 하나로 서버가 계속 보내줌)
WebSocket: 클라이언트 <──────────> 서버 (연결 하나로 양쪽이 자유롭게 주고받음)식당에 비유해 보겠습니다.
- 폴링: 식당에서 "제 음식 나왔어요?"라고 몇 분마다 카운터에 가서 묻기
- SSE: 진동벨을 받아 두면 음식이 나왔을 때 식당이 알려줌
- WebSocket: 직원과 전화를 연결해 두고 서로 아무 때나 말하기
폴링은 클라이언트가 물어봐야만 데이터를 받습니다. SSE와 WebSocket은 연결을 열어 두고 서버가 먼저 보내줄 수 있습니다.
2. 항목별 비교
| 항목 | 폴링 | SSE | WebSocket |
|---|---|---|---|
| 방향 | 클라이언트가 요청할 때만 | 서버 → 클라이언트 | 양방향 |
| 연결 | 요청마다 새로 (롱 폴링은 응답까지 유지) | 하나를 계속 유지 | 하나를 계속 유지 |
| 기반 | 일반 HTTP | HTTP | WebSocket 프로토콜 |
| 실시간성 | 숏: 간격만큼 지연 / 롱: 짧음 | 즉시 | 즉시 |
| 빈 요청 낭비 | 있음 | 없음 | 없음 |
| 데이터 | 자유 (JSON 등) | UTF-8 텍스트 | 텍스트·바이너리 |
| 브라우저 API | fetch |
3. 같은 기능, 세 가지 방식
"새 알림이 오면 화면에 표시하기"를 각각 구현하면 다음과 같습니다.
javascript
// 폴링: 5초마다 물어본다
setInterval(async () => {
const res = await fetch('/api/notifications');
render(await res.json());
}, 5000);
// SSE: 서버가 보내줄 때까지 기다린다
const source = new EventSource('/api/notifications/stream');
source.onmessage = (e) => render(JSON.parse(e.data));
// WebSocket: 받기도 하고 보내기도 한다
const ws = new WebSocket('wss://example.com/notifications');
ws.onmessage = (e) => render(JSON.parse(e.data));
ws.send(JSON.stringify({ type: 'read', id: 3 })); // 읽음 처리도 같은 연결로4. 서버 부담은 어떻게 다를까?
사용자 1,000명, 알림이 1분에 한 번 정도 생긴다고 가정합니다.
text
숏 폴링(5초): 1분에 12,000번 요청 → 대부분 "없음"
롱 폴링: 1분에 약 1,000~2,000번 요청 + 대기 중인 연결 1,000개
SSE: 연결 1,000개 유지 → 알림이 생길 때만 전송
WebSocket: 연결 1,000개 유지 → 알림이 생길 때만 전송폴링은 요청 수가, SSE와 WebSocket은 유지하는 연결 수가 부담입니다.
변화가 드물고 사용자가 적다면 폴링도 충분히 가볍습니다. 변화가 잦거나 사용자가 많을수록 지속 연결 방식이 유리해집니다.
5. 상황별 선택
| 상황 | 추천 | 이유 |
|---|---|---|
| 파일 변환·결제 같은 작업 상태 확인 | 폴링 | 짧은 시간만 확인하고 끝나므로 단순한 게 낫다 |
| 몇 분 늦어도 되는 대시보드 | 폴링 | 지속 연결을 유지할 이유가 없다 |
| 서버가 푸시를 지원하지 않는 외부 API | 폴링 | 다른 선택지가 없다 |
| AI 답변 스트리밍, 로그·진행률 표시 | SSE | 서버 → 클라이언트 텍스트 흐름 |
| 실시간 알림 피드 | SSE | 받기만 하면 된다 |
| 채팅, 협업 편집, 게임 | WebSocket | 양쪽이 자주, 즉시 주고받는다 |
| 바이너리(음성·영상 조각) 실시간 전송 | WebSocket | SSE는 텍스트만 다룬다 |
6. 선택 질문
순서대로 답해 봅니다.
- 몇 초 이상 늦어도 괜찮은가? 또는 잠깐만 확인하면 되는가? → 예: 폴링으로 충분합니다.
- 클라이언트도 서버로 실시간 이벤트를 자주 보내는가? 바이너리가 필요한가? → 예: WebSocket
- 서버가 보내주는 것만 받으면 되는가? → 예: SSE
처음에는 폴링으로 만들고, 요청이 많아지거나 지연이 문제가 될 때 SSE나 WebSocket으로 바꾸는 것도 현실적인 방법입니다.
7. 핵심 정리
폴링은 클라이언트가 반복해서 물어보는 방식이라 단순하지만 낭비와 지연이 있다. SSE는 서버가 한 연결로 계속 보내주는 단방향 스트림이고, WebSocket은 한 연결로 양쪽이 자유롭게 주고받는 양방향 통신이다. 늦어도 되면 폴링, 받기만 하면 SSE, 주고받아야 하면 WebSocket을 먼저 고려한다.