웹 개발에서 실시간 통신이 필요한 순간이 많다. 예전에는 짧은 주기로 폴링(polling) 요청을 보내야 했다면, 이제는 WebSocket이나 SSE(Server-Sent Events) 같은 기술로 좀 더 효율적으로 실시간 데이터를 주고받을 수 있다.
그런데 WebSocket이랑 SSE가 뭐가 다를까 헷갈릴 수 있다. 인터넷 글을 찾아봐도 양방향 vs 단방향 이 정도만 설명되어있는 경우가 있어서 조금 더 알아보도록 하자
WebSocket은 양방향 통신용, SSE는 단방향(서버→클라이언트) 스트리밍용
“서버와 클라이언트가 양방향으로 데이터를 주고받을 수 있는 실시간 통신 프로토콜”
ws:// (또는 보안 연결 시 wss://) @Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(new ChatHandler(), "/ws/chat")
.setAllowedOrigins("*");
}
}
public class ChatHandler extends TextWebSocketHandler {
@Override
public void handleTextMessage(WebSocketSession session, TextMessage message) {
// 메시지를 받아서 브로드캐스팅 등 로직 처리
}
}
“서버에서 클라이언트로 단방향 스트리밍을 지원하는 기술”
즉, 클라이언트는 연결을 맺은 뒤, 서버가 이벤트를event-stream형식으로 계속 보내주면 그걸 받기만 한다.
text/event-stream) EventSource 객체만 생성해주면 끝 폴리필(Polyfill) : 브라우저에서 지원하지 않는 코드를 사용 가능한 코드 조각이나 플러그인으로 변환한 코드
@RestController
@RequestMapping("/sse")
public class SseController {
@GetMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> stream() {
return Flux.interval(Duration.ofSeconds(1))
.map(seq -> "data: Hello SSE! seq=" + seq + "\n\n");
}
}
// 클라이언트
const eventSource = new EventSource("/sse/stream");
eventSource.onmessage = (event) => {
console.log("SSE 데이터:", event.data);
};
| 구분 | WebSocket | SSE(Server-Sent Events) |
|---|---|---|
| 통신 방식 | 양방향 (Full-Duplex) | 단방향 (Server → Client) |
| 프로토콜/스킴 | ws://, wss:// | HTTP (일반적으로 text/event-stream) |
| 재연결 처리 | 직접 구현 필요 | 자동 (브라우저가 알아서 재연결) |
| 사용 예 | 채팅, 실시간 게임, 주식 거래, 협업툴 | 실시간 알림, 로그/뉴스피드, 대시보드 모니터링 등 |
| 장점 | 빠른 양방향 통신, 이벤트 기반 | 간단한 설정, 자동 재연결, 텍스트 기반 스트리밍 |
| 단점 | 서버 자원 부담, 재연결 로직 필요, 구버전 IE 문제 | 단방향, 바이너리 전송 제약, 구버전 IE 문제 |
| 적합한 시나리오 | 사용자 입력에 따라 즉시 서버가 응답해야 하는 경우(챗) | 실시간 알림/모니터링 등 서버→클라가 주도되는 경우 |
서버 ↔ 클라이언트 양방향 대화가 필요한 경우: WebSocket
주로 서버에서 클라이언트로 자주 데이터가 바뀌는 경우: SSE
구현 난이도 & 운영 비용 측면 고려
실시간 통신이란 말만 들으면 무조건 WebSocket만 생각하기 쉽지만, SSE도 상당히 유용해보인다. 특히 이벤트성 알림, 대시보드, 로그 모니터링 등에는 SSE가 구현이 매우 간편하니, 내 서비스는 클라이언트에서 서버로 보내는 실시간 액션이 적다~ 싶으면 SSE도 적극 고려해볼 만한것같다.
물론 요즘은 HTTP/2(멀티플렉싱) 환경에서 이벤트 스트리밍이 더 효율적으로 처리되는 케이스도 많고, 완전히 대용량 트래픽을 다루려면 배포 구조, 로드밸런싱 같은 복잡도가 따라온다.
언제나처럼 상황과 요구사항을 잘 고려해야될듯
카프카를 좀 공부해봐야겠는데?