🖥 “웹에서 메시지를 주고받는 가장 쉬운 프로토콜” — STOMP를 깊게 들여다보자
🏁 STOMP란 무엇인가?
STOMP(Simple Text Oriented Messaging Protocol)는
🖥 텍스트 기반의 간단한 메시징 프로토콜로,
웹과 서버 간에 실시간 메시지를 주고받는 구조를 간단하게 만들어주는 기술입니다.
특히 웹소켓(WebSocket)을 함께 사용할 때
🏠 “채팅, 알림, 실시간 대시보드”
같은 기능을 구축하는 데 많이 사용됩니다.
쉽게 말하면,
📌 WebSocket이라는 자동차에
📌 STOMP라는 네비게이션을 얹어서
✔ 메시지를 정해진 규칙대로
✔ 목적지(토픽/큐)로 보내는 구조
라고 보면 이해가 쉽습니다.
🧱 STOMP가 필요한 이유
WebSocket은 실시간 양방향 통신에 최적화된 기술이지만
❌ 메시지 포맷 규칙이 정해져 있지 않습니다.
누가 어떤 메시지를 받을지, 어떤 채널로 보낼지 등 모든 것을 개발자가 직접 정의해야 합니다.
그래서 탄생한 것이 STOMP.
STOMP는 다음을 표준화합니다:
🏠 메시지 구조
🖥 목적지 주소
🏠 메시지 타입
🖥 구독/해제 규칙
🏠 에러 처리
즉, WebSocket을
✔ 더 안전하게
✔ 더 구조적으로
✔ 더 예측 가능하게
사용하도록 도와주는 계층이라고 보면 됩니다.
🧩 STOMP 메시지 구조
STOMP는 텍스트 기반이라서 사람이 직접 읽어도 이해가 쉽습니다.
예시:
SEND
destination:/topic/chat
content-type:text/plain
안녕하세요
STOMP의 핵심 구성요소는 다음과 같습니다.
🏠 1. Command
메시지의 ‘의도’를 알려주는 문자열
예: CONNECT, SEND, SUBSCRIBE, MESSAGE
🏠 2. Header
메타데이터
예: destination, content-type, id 등
🏠 3. Body
실제 메시지 본문
텍스트 기반 → 읽기 쉽고 디버깅이 쉬움
🔧 주요 Command 설명
아래는 STOMP에서 자주 사용하는 명령입니다:
| Command | 설명 |
|---|---|
| CONNECT | 서버와 연결 시작 |
| DISCONNECT | 연결 종료 |
| SEND | 메시지 전송 |
| SUBSCRIBE | 특정 채널 구독 |
| UNSUBSCRIBE | 구독 해제 |
| MESSAGE | 서버가 보내는 메시지 타입 |
| ERROR | 오류 메시지 |
TCP/WS 위에서 이런 명령을 주고받으며 동작합니다.
🌐 STOMP는 어디에 사용될까?
STOMP는 아래와 같은 실시간 서비스에 강력합니다:
🏠 채팅 시스템
🖥 실시간 알림(Notification)
🏠 주식/환율 등 실시간 데이터 스트리밍
🖥 IoT 센서 정보 모니터링
🏠 게임 실시간 위치 정보 전송
🖥 실시간 프로젝트 협업
특히 “토픽 기반 브로드캐스트”를 처리하는 데 매우 적합합니다.
💡 STOMP와 WebSocket의 관계
WebSocket은 단순히
🖥 “지속적으로 연결된 파이프”
역할만 합니다.
하지만 메시지가 많아지면 문제가 생깁니다:
❌ 누가 누굴 구독하는지
❌ 메시지는 어떤 채널로 보내는지
❌ 사용자 그룹별 전송은 어떻게 할지
❌ 에러는 어떻게 처리하는지
WebSocket만으로는 모든 로직을 직접 만들어야 하고 복잡합니다.
그래서 STOMP는 이 위에서
✔ 메시지 라우팅
✔ 목적지 주소
✔ 구독 관리
✔ 헤더 기반 메타데이터
✔ 에러 처리
모두 제공하는 ‘메시징 규약 레이어’로 사용됩니다.
🏢 STOMP를 지원하는 서버
2025년 현재 STOMP는 다양한 서버와 호환됩니다.
🏠 RabbitMQ
🖥 ActiveMQ
🏠 Apollo
🖥 Spring WebSocket(Spring Boot에서 가장 많이 사용)
🏠 Kaazing WebSocket Gateway
🖥 Netty 기반 메시징 서버
특히 Spring Boot는 STOMP를 자연스럽게 지원해서
국내 기업에서 가장 많이 사용하는 형태입니다.
🛠 STOMP 메시지 동작 흐름
실시간 채팅을 예로 들어 보겠습니다.
- 클라이언트는 WebSocket으로 서버에 CONNECT
- CONNECT가 성공하면 SUBSCRIBE로 채널 구독
- 사용자 A가 메시지를 SEND로 전송
- 서버는 destination:/topic/chat 으로 메시지를 라우팅
- SUBSCRIBE한 모든 사용자가 MESSAGE를 수신
- 종료 시 DISCONNECT
위 흐름이 거의 모든 실시간 서비스에서 공통적으로 사용됩니다.
🧱 STOMP의 장점
🏠 메시징 규칙이 명확
메시지 처리 구조가 단순하고 안정적
🖥 텍스트 기반이라 디버깅 쉬움
바로 눈으로 보면 됨
🏠 브로커 기반 확장성
RabbitMQ와 함께 쓰면 대규모 서비스도 가능
🖥 구독/해제 기능 표준화
실시간 서비스 만들기 매우 쉬워짐
🏠 WebSocket보다 구조적인 서비스 개발 가능
❌ STOMP의 단점
❌ 성능은 이진 기반 프로토콜보다 떨어질 수 있음
❌ WebSocket보다 약간 오버헤드 증가
❌ 텍스트 기반이라 대용량 메시지 비효율
❌ 브로커 설정이 초보자에게 어려울 수 있음
그래도 대부분의 웹 기반 실시간 서비스에서는
“확장성과 실용성” 덕분에 STOMP가 널리 사용됩니다.
📝 STOMP 메시지 예제
1. 구독 요청
SUBSCRIBE
id:sub-1
destination:/topic/board
2. 메시지 보내기
SEND
destination:/topic/board
content-type:text/plain
오늘은 좋은 날입니다
3. 서버에서 보내는 메시지
MESSAGE
subscription:sub-1
message-id:007
destination:/topic/board
오늘은 좋은 날입니다
🔮 2025년 이후 STOMP는 계속 사용될까?
답은 예, 계속 사용됨입니다.
왜냐하면,
🏠 WebSocket은 계속 쓰인다
🖥 실시간 서비스는 늘어난다
🏠 텍스트 기반 규칙이 단순해 유지보수 좋다
🖥 Spring Boot에서 공식적으로 밀어줌
🏠 RabbitMQ 같은 브로커가 여전히 강세
따라서 STOMP는 앞으로도
“웹 환경에서 실시간 메시징을 구현하는 가장 쉬운 방법”으로 남을 가능성이 높습니다.
🎯 마무리: STOMP를 알아야 하는 이유
2025년 기준 STOMP를 이해하면 다음을 할 수 있습니다.
🖥 채팅 서비스 개발
🏠 실시간 알림 구축
🖥 모니터링 대시보드 제작
🏠 WebSocket 기반 서비스 확장
🖥 RabbitMQ와 연동한 대규모 메시징 구축
특히 Spring 환경에서 실시간 서비스를 만들려면
STOMP는 사실상 필수 지식입니다.