[Network] STOMP란? 웹소켓 위에서 메시징을 관리하는 세련된 방법



1. STOMP란 무엇인가?

STOMP(Simple Text Oriented Messaging Protocol)는 말 그대로 '텍스트 기반의 단순한 메세징 프로토콜'이다. 

WebSocket은 사실 데이터를 실어나르는 통로의 역할을 하지만 실질적으로 그 안에 담긴 데이터를 어떻게 처리할지는 정해져 있지 않다.

STOMP는 이 WebSocket이라는 통로 위에 메세지 형식규격을 입혀준다. (STOMP 공식 사이트)


2. STOMP의 이점 

Raw WebSocket은 메세지의 형식이 정해져 있지 않아, 서버에서 매번 메세지를 직접 파악해야 한다. 이는 개발자의 입장에서 데이터에 대해 일일히 파싱 로직을 짜야하기 때문에 피로도가 증가한다. 하지만 STOMP를 사용한다면 규칙이 정해져 있기 때문에  읽기 쉽고 사용하기 좋다. 기본적으로 아래의 규칙이 있다.

1. Pub/Sub 모델 간편 구현 : 특정 주제(Topic)를 구독하고, 해당 주제로 메세지를 발행하는 구조
2. 메세지 브로커 활용 가능 : RabbitMQ, ActiveMA 같은 외부 브로커와 쉽게 연동하여 대규모 트래픽 처리 가능
3. 헤더(Header) 기반 처리 : 인증 정보나 메타데이터를 담기 매우 편리


3. STOMP의 핵심 구조

STOMP는 HTTP와 매우 유사한 구조를 가지고 있어 읽기가 매우 쉽다. 하나의 메시지는 Command, Header, Body로 구성된다.
  • Command: CONNECT, SEND, SUBSCRIBE, DISCONNECT 등 동작을 정의
  • Header: destination(어디로 보낼지), content-type 등 부가 정보를 담는다. (Key-value 형식)
  • Body: 실제 주고받을 데이터(주로 JSON)가 들어간다.

아래는 Client가 특정 채팅방(/topic/chat/1)으로 JSON 데이터 보낼 때의 예시이다.

4. STOMP 동작 원리 (Pub/Sub 흐름)


  • subscriber(receive socket) : 채팅방에 입장하여 해당 채팅창을 구독, 즉 참여하고 있는 채팅창에 오는 메시지를 실시간으로 받아볼 수 있으려면 먼저 구독이 되어있어야 한다.
  • sender(send socket) : 참여하고 있는 채팅창에 글을 써서 해당하는 주소로 메시지를 전달한다.
  • broker : 연결된 socket들의 세션 관리를 해준다. 즉, subscriber를 구독한 채널에 연결시켜주고, sender가 그 채널에 메시지를 보내면 subscriber에게 전달해주는 중간 다리 역할을 한다.

subscriber가 채팅창 채널을 구독하겠다고 broker에게 알리면 해당 채널로(roomNo로 판별) sender가 메시지를 보낼 경우 broker가 메시지를 응답해주는 흐름이다.

추가적으로 Message Borker는 Publisher로부터 전달받은 메세지를 Subscriber로 전달해주는 중간 역할자이며, 응용 소프트웨어 간에 메시지를 교환할 수 있게 한다.

이 때 메세지가 적재되는 공간을 Message Queue라고 하며 메세지의 그룹을 Topic이라고 한다. 


5. STOMP 활용 및 한계

STOMP는 다수의 사용자가 실시간으로 상호작용하는 서비스에서 유용하다. 예를 들자면 아래와 같은 서비스가 있다.

  • 실시간 채팅 및 그룹 메시징 : 일반적인 채팅방 
  • 실시간 대시보드 및 알림 : 주식 시세, 스포츠 경기 스코어 중게 등
  • 협업 도구 : 구글 독스, 피그마
  • 게이밍 시그널링 : 게임 로비에서의 채팅, 준비 상태 확인

하지만 만능처럼 보이는 STOMP도 아래의 상황에서는 도입을 고려해야 한다.

  • 메세지 오버헤드 : STOMP는 데이터를 텍스트로 처리하기 때문에 다른 바이너리 통신을 하는 프로토콜에 비해 데이터 크기가 크다.
  • 대용량 파일 전송 부적합 : STOMP 자체가 짧은 메세지를 빈번하게 주고받기에 최적화되어 있다. 수백 MB의 파일을 전송하는 것은 서버 메모리와 네트워크에 큰 부담을 준다.
  • 브라우저 네이티브 지원 미비 : 대부분 현대 브라우저는 WebSocket을 지원하지만, STOMP는 직접 지원하지 않는다. 따라서 stomp.js와 같은 별도의 자바스크립트 라이브러리를 반드시 포함해야 한다.
  • 복잡한 흐름 제어의 부재 : TCP처럼 세밀한 흐름 제어나 혼잡 제어 기능이 약하다. 아주 정교한 네트워크 제어가 필요한 초고성능 시스템에서는 도입을 안하는게 좋다.

최종적으로 STOMP와 Raw WebSocket을 표로 비교하면 다음과 같다.

구분STOMP (Pub/Sub)Raw WebSocket
개발 난이도낮음 (규격화됨)높음 (직접 구현)
메시지 크기약간 큼 (헤더 포함)매우 작음 (최소화 가능)
확장성뛰어남 (브로커 연동 쉬움)보통 (직접 설계 필요)
적합한 서비스일반적인 실시간 서비스초고속/대용량 특수 서비스


댓글 쓰기

0 댓글