0-1. 웹소켓이란?
- WebSocket 프로토콜은 접속 확립에 HTTP를 사용하지만, 그 후의 통신은 WebSocket 독자의 프로토콜로 이루어진다.
- header가 상당히 작아 overhead가 적은 특징이 있다.
- 실시간 양방향 데이터 통신이 필요한 경우, 많은 수의 동시 접속자를 수용해야 하는 경우, 브라우저에서 TCP 기반의 통신으로 확장해야 하는 경우 등.
- 응용 계층(OSI 7계층) 수준의 프로토콜
- 주로 사용되는 경우
- 동시 접속자 수 많고 빠른 반응이 필요한 서비스
- 실시간 채팅, 알림, 주식 시세 등
0-2. HTTP vs 웹 소켓 차이점?
결정적인 차이는 프로토콜에 있다. HTTP는 질문하면 대답하는 통신, WebSocket은 서로 실시간 대화하는 통신
| 구분 |
HTTP |
WebSocket |
| 통신 방식 |
요청/응답 기반 (Request-Response) |
양방향 (Full-duplex) |
| 연결 유지 |
매 요청마다 새 연결 (Stateless) |
한 번 연결 후 계속 유지 (Stateful) |
| 프로토콜 |
HTTP/1.1, HTTP/2 |
WebSocket(ws://, wss://) |
| 헤더 크기 |
큼 (메타데이터 포함) |
작음 (오버헤드 최소화) |
| 서버 → 클라이언트 통신 |
불가능 (단, Polling, SSE 등으로 우회) |
가능 (서버가 직접 Push 가능) |
| 사용 목적 |
문서/리소스 전송 중심 |
실시간 데이터 교환 중심 |
1. WebSocketHandler
- Spring Framework에서 웹소켓 통신을 처리하기 위한 기본 핸들러 클래스
- WebSocket 연결 수립, 메시지 송수신, 연결 종료 등 이벤트 기반 콜백 메서드를 제공
- 주로 TextWebSocketHandler를 상속받아 사용
- 직접 세션 관리하고, 메시지 라우팅 에러처리 등을 구현해야 함
- 텍스트 기반 통신을 기본
- 단순한 실시간 알림, 주가 정보 등 가볍고 빠른 실시간 통신에 적합
2. STOMP (Simple Text Oriented Messaging Protocol)
- WebSocket 위에서 동작하는 메시징 프로토콜
- WebSocket이 단순 통로라면, STOMP는 그 통로 안의 대화 규칙(프로토콜)
- 텍스트 기반 프로토콜
- SEND, SUBSCRIBE, MESSAGE, CONNECT 등의 명령으로 메시지를 주고받음
- Pub/Sub (발행 - 구독) 구조를 지원하며, 클라이언트가 토픽을 구독하면 서버가 해당 주제로 브로드캐스트 가능
- Spring WebSocket + STOMP 구조
- /app : 클라이언트 → 서버 메시지 경로
- /topic : 서버 → 클라이언트 브로드캐스트
- 메시지 브로커와 연동하여 확장성 있는 구조도 구축 가능
- 장점
- 메시징 구조가 표준화되어 관리/확장 용이
- 브로커 연동으로 대규모 서비스 구현 가능
- 구독/발행 구조로 다중 사용자 실시간 알림에 적합
- 단점
- 텍스트 기반으로 오버헤드가 존재
- 구조가 복잡하고 저지연 고빈도 스트림에는 부적합
3. Socket.io
- WebSocket을 우선 사용하지만, 브라우저가 지원하지 않거나 네트워크 제약이 있으면 fallback을 사용한다.
- 즉, WebSocket 지원되면 WebSocket으로, 지원이 안 되면 HTTP Long polling으로 흉내낸다.
- 이 방식 덕분에 모든 환경에서 ‘실시간 통신처럼’ 작동할 수 있다.
- 이벤트 기반 아키텍처를 사용한다.
- 클라이언트와 서버가 특정 이벤트 이름을 기준으로 메시지를 송수신한다.
4. 장단점
| 항목 |
WebSocketHandler |
STOMP |
Socket.io |
| 기반 기술 |
WebSocket |
WebSocket + STOMP 프로토콜 |
WebSocket + fallback(HTTP) |
| 언어/환경 |
Java(Spring) |
Java(Spring) |
Node.js |
| 메시징 구조 |
직접 구현 |
Pub/Sub 구조 |
이벤트 기반 |
| 확장성 |
낮음 |
높음 (브로커 연동) |
중간 |
| 데이터 형태 |
텍스트 / 바이너리 |
텍스트 |
텍스트 / 바이너리 |
| 주 사용처 |
실시간 알림, 주가 서비스 |
채팅, 알림, 방송형 서비스 |
실시간 협업, 채팅 |
| 특징 요약 |
단순·고성능 |
구조적·확장성 |
호환성·유연성 |
5. 정리
- WebSocketHandler → WebSocket을 직접 다루는 Spring 구현체
- STOMP → WebSocket 위에서 메시징 규칙을 추가한 프로토콜
- Socket.io → WebSocket을 확장한 Node.js 라이브러리 (이벤트 기반 + fallback 지원)
결국 세 가지 모두 WebSocket을 기반으로 실시간 통신을 구현하는 방식