1. WebSocket

개념
- 클라이언트와 서버 간 실시간 양방향 통신을 가능하게 하는 프로토콜
- WebSocket 이전에는 서버가 실시간 데이터를 보내기 위해 폴링(polling), 롱 폴링(long polling), 스트리밍(streaming) 같은 우회 방식들이 사용되었으나, WebSocket은 이러한 문제를 근본적으로 해결
- WebSocket은 최초 handshake 요청 후 연결 지속
- 최초 연결시 HTTP헤더를 통해 token과 같은 인증 정보를 보내 인증처리 가능
- 최초 연결 이후 별도 http메시지 없이 통신 가능(http -> WebSocket 프로토콜로 전환되어 TCP연결 유지)

특징
- HTTP통신과 다르게 http:가 아닌 ws://의 url사용
- 구현이 복잡(최초 handshake 이후 연결이 계속 유지되므로 서버가 각 연결의 상태를 직접 관리)
- 별도 메모리에 세션 정보 저장: ConcurrentHashMap 같은 스레드-안전한 자료구조 사용
- 메모리 누수 방지: 사용자가 연결 끊기는 경우 연결 종료 이벤트(SessionDisconnectEvent)에서 세션 제거 필요(세션 정보 쌓이면 서버에 부하)
2. STOMP
개념
- 웹소켓 위에서 동작
- Simple Text Oriented Messaging Protocol의 약자로 WebSocket 기반으로 동작하는 메시징 프로토콜을 의미
- 텍스트 기반 메시징 프로토콜
- 메시지는 사람이 읽을 수 있는 텍스트 형태의 프레임(Frame)으로 구성
- 각 프레임은 명령(Command), 헤더(Header), 그리고 본문(Body)으로 구성
- Publish-Subscribe(pub-sub) 구조
- 메시지를 보내는 쪽(Publisher)과 받는 쪽(Subscriber)을 분리해서 작동
- 메시지는 특정 주제(topic)나 큐(queue)를 통해 전달
- 브로커를 통한 메시지 중계
- 클라이언트가 메시지를 보내면 메시지 브로커(서버 내 혹은 외부)가 해당 메시지를 받아서 구독자들에게 전달하는 역할을 수행

WebSocket과 STOMP비교
| 구분 | WebSocket | STOMP |
| 계층 | 전송(Transport) 프로토콜 - TCP 위에서 동작 | 애플리케이션(Application) 메시징 프로토콜 - 웹소켓 위에서 동작 |
| 기능 | 단순 양방향 실시간 통신 채팅 등 단순 송수신 중심 |
Pub/Sub(구독/발행), 목적지별 라우팅, 브로커 지원, 프레임 명령어 관리 등 고수준 메시징 |
| 확장성 | Pub/Sub, 브로커, 라우팅 등 직접 구현 필요(구현 복잡) | 주제(topic), 큐(queue) 등 구독 구조와 메시지 라우팅(브로커 연동 쉽게 지원) |
| 디버깅/가독성 | 데이터 형식 자유(직접 정의)로 로깅·분석 난이도 다소 높음 | 사람이 읽을 수 있는 텍스트 기반, 프레임/명령어 구분 명확(디버깅 쉬움) |
| 적용 예시 | 실시간 채팅, 게임, 실시간 데이터(주식·위치 등) | 채팅, 협업툴, 실시간 알림, 메시지 브로커 연동 서비스 등 |
- 웹소켓은 단순히 서버-클라이언트 간 실시간 데이터 전송용 채널 제공
- STOMP는 웹소켓 위에서 동작하며, 채팅방, 주제(topic) 등 “어떤 메시지가 어디로 가야 하는지”를 정해주는 메시징 규칙과 구조를 제공 -> 개발을 더 쉽고 확장성 있게 만들어줌
reference
인프런 <웹소켓/STOMP 채팅서비스(spring, vue, redis)> 강의