웹에서 실시간 데이터를 처리해야 하는 경우가 있는데, 이럴 때 단순한 HTTP 요청/응답 구조로는 한계가 있다.
그래서 다양한 서버-클라이언트 통신 방식이 존재하며, 그 중 하나가 SSE(Server-Sent Events)이다.
👉 SSE는
서버가 클라이언트에게 지속적으로 데이터를 보내는 단방향 스트리밍 방식
클라이언트와 한 번 연결을 맺으면, 서버가 이벤트를 계속 push 해준다.
서버와 클라이언트가 통신하는 대표적인 방식은 다음 세 가지다.
Polling은 가장 단순한 방식으로, 클라이언트가 일정 주기로 서버에 계속 요청을 보내는 구조다.
Client → Server (요청)
Client → Server (요청)
Client → Server (요청)
예시:
setInterval(() => {
fetch('/api/data')
}, 3000)
“쉽지만 비효율적인 방식”
WebSocket은 완전한 실시간 통신 방식으로, 클라이언트와 서버가 연결을 유지하면서 양방향으로 데이터를 주고받는다.
Client ↔ Server (양방향 통신)
초기에 HTTP handshake를 하고, 이후에는 WebSocket 프로토콜로 통신한다.
“강력하지만 복잡한 방식”
SSE는 WebSocket보다 단순한 실시간 방식으로, 서버 → 클라이언트 방향으로만 데이터를 지속적으로 보내는 구조
Client -------- 요청 --------> Server
Client <---- 이벤트 스트림 ---- Server
Client <---- 이벤트 스트림 ---- Server
“단순하고 실용적인 실시간 스트리밍 방식”
const eventSource = new EventSource('/api/sse')
eventSource.onmessage = (event) => {
console.log('받은 데이터:', event.data)
}
eventSource.onerror = (err) => {
console.error('에러 발생', err)
}
헤더 설정:
Content-Type: text/event-stream
데이터 형식:
data: Hello World
data: Another message
👉 빈 줄로 이벤트를 구분한다
세 가지 통신 방식을 정리하면: