SSE(Server-Sent Events) 알아보기

Sara Jo·2026년 4월 18일
post-thumbnail

웹에서 실시간 데이터를 처리해야 하는 경우가 있는데, 이럴 때 단순한 HTTP 요청/응답 구조로는 한계가 있다.

그래서 다양한 서버-클라이언트 통신 방식이 존재하며, 그 중 하나가 SSE(Server-Sent Events)이다.

👉 SSE는
서버가 클라이언트에게 지속적으로 데이터를 보내는 단방향 스트리밍 방식

클라이언트와 한 번 연결을 맺으면, 서버가 이벤트를 계속 push 해준다.


🔄 서버-클라이언트 통신 방식 비교

서버와 클라이언트가 통신하는 대표적인 방식은 다음 세 가지다.

  • Polling
  • WebSocket
  • SSE(Server-Sent Events)

🔁 1. Polling (폴링)

Polling은 가장 단순한 방식으로, 클라이언트가 일정 주기로 서버에 계속 요청을 보내는 구조다.

Client → Server (요청)
Client → Server (요청)
Client → Server (요청)

예시:

setInterval(() => {
  fetch('/api/data')
}, 3000)

👍 장점

  • 구현이 매우 쉬움
  • 모든 환경에서 동작

👎 단점

  • 데이터가 없어도 계속 요청 → 비효율
  • 실시간성이 떨어짐 (interval에 의존)
  • 서버 트래픽 증가

“쉽지만 비효율적인 방식”


🔌 2. WebSocket

WebSocket은 완전한 실시간 통신 방식으로, 클라이언트와 서버가 연결을 유지하면서 양방향으로 데이터를 주고받는다.

Client ↔ Server (양방향 통신)

초기에 HTTP handshake를 하고, 이후에는 WebSocket 프로토콜로 통신한다.

💡 특징

  • 양방향 통신 (bidirectional)
  • 낮은 지연
  • 지속적인 연결 유지

👍 장점

  • 진짜 실시간 통신 가능
  • 서버 ↔ 클라이언트 자유롭게 데이터 전송
  • 이벤트 기반 구조

👎 단점

  • 구현 복잡도 높음
  • 서버/인프라 설정 필요
  • 연결 관리 직접 처리 필요 (재연결, heartbeat 등)

📍 사용 예시

  • 채팅 서비스
  • 실시간 게임
  • 협업 툴 (Google Docs, Figma 등)

“강력하지만 복잡한 방식”


📡 3. SSE (Server-Sent Events)

SSE는 WebSocket보다 단순한 실시간 방식으로, 서버 → 클라이언트 방향으로만 데이터를 지속적으로 보내는 구조

Client  -------- 요청 --------> Server
Client  <---- 이벤트 스트림 ---- Server
Client  <---- 이벤트 스트림 ---- Server

💡 특징

  • 단방향 통신 (Server → Client)
  • HTTP 기반
  • 연결 유지

👍 장점

  • 구현이 매우 간단 (EventSource)
  • HTTP 기반이라 인프라 친화적
  • 자동 재연결 지원
  • Polling보다 효율적

👎 단점

  • 단방향 통신만 가능
  • 브라우저 연결 수 제한
  • 텍스트 기반 (바이너리 처리 비효율)
  • 일부 환경에서 timeout 이슈 가능

📍 사용 예시

  • 실시간 알림
  • AI 응답 스트리밍
  • 로그 스트리밍

“단순하고 실용적인 실시간 스트리밍 방식”


🔧 SSE 기본 사용 방식

클라이언트

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

👉 빈 줄로 이벤트를 구분한다


🧩 언제 SSE를 쓰는게 좋을까?

👉 SSE가 적합한 경우

  • 서버 → 클라이언트 데이터 흐름만 필요
  • 실시간 업데이트가 중요
  • 구현을 단순하게 유지하고 싶음
  • AI 응답 스트리밍 (대표적인 케이스)

👉 SSE보다 WebSocket이 적합한 경우

  • 채팅 서비스
  • 실시간 게임
  • 협업 툴
  • 클라이언트 ↔ 서버 간 양방향 이벤트가 많은 경우

✨ 마무리

세 가지 통신 방식을 정리하면:

  • Polling → 쉽지만 비효율적
  • WebSocket → 강력하지만 복잡함
  • SSE → 단순하면서 실용적

0개의 댓글