STOMP란?
채팅을 구현하기 위해 웹소켓을 찾아보다 보면 항상 나오는 프로토콜인 STOMP. 이 친구는 무엇일까?
Simple Text Oriented Messaging Protoco
Simple (단순한): 설계가 간단하고 사용이 직관
Text Oriented (텍스트 기반): STOMP는 텍스트 형식의 메시지를 주고받는 방식
Messaging Protocol (메시징 프로토콜): 클라이언트와 서버 간에 메시지를 송수신하는 방법 정의해놓은 프로토콜
더불어 Websocket과 분리되어 선택할 수 있는 프로토콜이 아닌 Websocket 위에서 동작하는 프로토콜로써 클라이언트와 서버가 전송할 메세지의 유형, 형식, 내용을 정의하는 메커니즘이다.
그렇다면 웹소켓만 사용할 때와 STOMP까지 결합시켰을 때의 흐름은 어떤 것이 다를까?
웹소켓 흐름
- 그림에 나와있진 않지만 전송 계층에서 TCP 연결 설정(TCP 3-way handshake)을 진행하고 HTTP 프로토콜을 통해 웹소켓 연결로 업그레이드한다.
- 업그레이드 과정은 다음과 같다. HTTP Upgrade 요청(웹소켓 프로토콜로 바꿔줘~!)을 브라우저에서 보내면 Status 101 응답을 보내게 되고 Websocket 연결이 완료된다.
- 그 이후는 양방향 통신, 통신 종료 요청이 진행되는데 이 때 양방향 통신과정에서의 메시지 형식은 자유롭다.
정해진 명세가 없어 개발자가 직접 메시지 형식을 정의하고 전달해야 한다.
STOMP 흐름
- 기본적인 흐름은 동일하나 웹소켓 연결 이후 STOMP 연결이 진행되고 통신이 종료될 땐 연결의 반대 순서로 STOMP, 웹소켓 순으로 종료가 진행된다.
- 양방향 통신에서의 메시지 형식은 어떤지 확인해보자. 정확히는 모르겠지만 웹소켓만 사용했을 때보다 형식이 갖추어진 모습을 확인할 수 있다.
STOMP frame 구조
기본적으로 명령, 헤더, 바디 세부분으로 나뉜다.
명령: connect, subscribe, send, disconnect 등과 같은 수행할 작업에 대한 키워드가 들어간다.
헤더: 명령의 메타 데이터로 여기에서는 메시지의 경로, 데이터 유형 등을 입력할 수 있다.
바디: 실제 메시지 등 데이터가 들어가며 ^@(Null 문자)를 통해 frame의 종료를 알린다.
Pub/Sub, 메시지 브로커
Pub/Sub구조는 STOMP에서 중요한 개념 중 하나이다. 웹소켓은 라우팅, 구독/발행 등 추가적인 기능을 직접 구현해야 하므로 중요한 차이점이라고도 할 수 있겠다.
Pub/Sub 모델에서는 한쪽이 메시지를 보내면(Pub) 다른 쪽이 그 메시지를 받아 처리하는 (Sub)구조이다.
이해를 위해 예시를 들자면, 유튜브에서 사용자가 특정 채널을 구독하고 알림 설정을 하면 채널 소유자가 영상을 업로드(발행-Pub)하면 구독자는 해당 영상에 대한 알림을 자동을 받아볼 수 있다.(구독-Sub)
이 과정에서 같이 나오는 개념인 메시지 브로커에 대해 알아보자.
브로커는 '중개'의 의미를 가지고 있다. 여기서 메시지 브로커는 '메시지 전송 중개 역할'을 한다고 볼 수 있다.
그럼 이 메시지 브로커는 어떤 점 때문에 도입해야 하는 걸까?
관심사를 분리할 수 있다는 점이다. 송신자 측은 publish만 잘해주면 되고 수신자가 잘 받았는지는 알 필요가 없다.
수신자 측 역시 누가 보냈는지 어떻게 보냈는지와 같은 정보는 알 필요가 없고, 구독만 잘 하고 있으면 된다.
그렇다면 실제 전반적인 흐름은 어떻게 되는 것일까?
통신 흐름도
(서버 구현을 위한 코드는 이미 이전 포스팅에 있어 상세 설명은 생략하도록 하겠습니다:) )
위와 같은 설정을 해주었다는 전제하에 아래 흐름을 보도록 하자.
<통신 흐름 과정>
1. 먼저, 송신자 측에서는 SEND로 메시지를 보낼 수도, SUBSCRIBE로 특정 경로를 구독할 수도 있다.
2. 해당 요청에 대해 경로를 분석했을 때(config에서 설정함) /app, /topic prefix에 따라 길이 달라진다.
a. /app 즉, 발행경로 prefix로 설정한 경로가 들어오면 SimpleAnnotationMethodMessageHandler가 낚아 controller에서 설정해준 @MessageMapping을 확인하고 그때의 @SendTo를 확인한다.
b. /topic 즉, 구독경로 prefix로 설정한 경로가 들어오면 SimpleBrokerMessageHandler가 낚고 메시지 브로커에 해당 경로를 세션과 함께 추가한다. (=해당 경로로 메시지가 발행되면 이를 구독한 사용자에게 메시지를 보내는 설정)
3. 2-a로 들어온 메시지는 컨트롤러에 담긴 구독경로를 확인해 도착지로 구독경로를 담고 COMMAND SEND 에서 MESSAGE로 COMMAND를 바꾸고 메시지를 메시지 브로커에 넘긴다.
4. 메시지 브로커는 해당 경로를 구독한 클라이언트들에게 메시지를 보낸다.
*참고자료*
STOMP란?
websocket 위에서 동작하는 문자 기반 메세징 프로토콜로써 클라이언트와 서버가 전송할 메세지의 유형, 형식, 내용들을 정의하는 매커니즘이다.TCP와 웹소켓과 같은 신뢰할 수 있는 양방향 스트리
velog.io
Stomp, WebSocket 개념 정리(ver. Spring)
화상 채팅 프로젝트를 진행하면서 채팅 기능을 구현중에 웹 소켓 관련하여 정리가 필요하여 글을 쓰게 되었다. 먼저 웹소켓에 대해서 알아보자! 웹 소켓 소개 웹소켓 프로토콜은 웹 애플리케이
velog.io
WebSocket과 Stomp를 이용해서 채팅 구현하기
"모두의 텃밭"이라는 텃밭 중개 플랫폼에 채팅 기능을 추가하게 되면서 겪었던 문제들과그 방법들을 정리해보려고 합니다.HTTP와 비교해서 정리합니다.HTTP비연결성매번 연결 맺고 끊는 과정의
velog.io
Spring boot WebSocket + STOMP protocol
메세징 전송을 효율적으로 하기 위해 탄생한 프로토콜Text 지향 프로토콜이나, Message Payload에는 Text or Binary 데이터를 포함할 수 있음메세지 브로커를 사용하여 pub / sub 구조로 되어있어 메세지를
velog.io
[ 네트워크 쉽게 이해하기 22편 ] TCP 3 Way-Handshake & 4 Way-Handshake
우선 TCP의 3-way Handshaking 에 대하여 알아보겠습니다. * TCP 3-way Handshake 란? TCP는 장치들 사이에 논리적인 접속을 성립(establish)하기 위하여 three-way handshake를 사용한다. TCP 3 Way Handshake는 TCP/IP프로토
mindnet.tistory.com
[Spring][WebSocket] 스프링 STOMP와 웹 소켓 개념 및 사용법 (Web Socket with STOMP) (1)
클라이언트와 서버가 통신할 때 HTTP 통신을 주로 사용한다. HTTP 통신은 다음과 같은 특징이 있다. 비연결성 (connectionless) : 연결을 맺고 요청을 하고 응답을 받으면 연결을 끊어버린다. 무상태성 (
growth-coder.tistory.com
[Web] 웹 소켓(Web Socket)이란? 등장 배경과 목적, 동작 방식 (feat. Polling, Long polling, Server-Sent Event)
📖 들어가며이번 포스팅은 웹 소켓(Web Scoket)에 대한 포스팅을 하려고 합니다. 이 글을 읽으시는 분들은 아마 웹 소켓이 무엇인지 정도는 알고 있을 것이라고 생각합니다. 맞습니다. 실시간 통
yong-nyong.tistory.com
'백엔드' 카테고리의 다른 글
(Design Pattern) 디자인 패턴 들어가기 (핵심 14가지 패턴) (1) | 2025.03.09 |
---|---|
JPA란?(Java Persistence API) with 영속성 컨텍스트 (0) | 2024.12.01 |
웹소켓이란? 웹소켓을 채팅구현하기 -이론편 (with Spring) (5) | 2024.11.03 |
⚠️ 스프링 시큐리티(Spring Security)와 그 작동 구조 (0) | 2024.10.05 |
[SERVER] CORS preflight request 에러 (0) | 2024.07.21 |