STOMP (Simple Text Oriented Message Protocol)
정의
메시지 전송을 효율적으로 하기 위한 프로토콜이다
웹소켓 위에 얹어 함께 사용할 수 있다
PUB / SUB 구조로 되어있다
클라이언트와 서버가 전송할 메시지의 유형, 형식, 내용들을 정의하는 매커니즘이다
메시지의 헤더에 값을 줘서 인증 처리를 구현하는 것도 가능하다
PUB / SUB
메시지를 공급하는 주체와 소비하는 주체를 분리해 제공하는 메시징 방법이다
채팅방 생성 == 우체통 (Topic)
채팅방에 글을 쓴다 == 집배원 (Pub)
채팅방에 들어간다 == 구독자 (Sub)
Message Broker
발신자의 메시지를 받아와서 수신자들에게 메시지를 전달하는 매개이다
Spring에서 지원하는 STOMP를 사용하면 Simple In-Memory Broker를 이용한다
RabbitMQ, ActiveMQ 같은 외부 메세징 시스템을 STOMP Broker로 사용할 수 있도록 지원한다
스프링은 메시지를 외부 Broker에게 전달하고
Broker는 WebSocket으로 연결된 클라이언트에게 메시지를 전달한다
프레임 구조
웹소켓과 다르게 보내는 형식이 정해져있음
COMMAND (SEND(메세지 전송)/SUBSCRIBE(메세지 구독))
header1:value1 : 어디로 보낼지 destination이 됨
header2:value2
Body^@ : payload
예시
<ClientA가 5번채팅방에 대해 구독>
SUBSCRIBE
destination: /topic/chat/room/5
id: sub-1
^@
<ClientB에서 채팅메세지 보냄>
SEND
destination: /pub/chat
content-type: application/json
{"chatRoomId": 5, "type": "MESSAGE", "writer": "clientB"} ^@
<받은 메세지를 모든 구독자에게 보냄>
MESSAGE
destination: /topic/chat/room/5
message-id: d4c0d7f6-1
subscription: sub-1
{"chatRoomId": 5, "type": "MESSAGE", "writer": "clientB"} ^@
PUB / SUB 메시징 흐름

SEND == 발신자 / 구독자에게 메시지를 보내고 싶어하는 존재
MESSAGE == 구독 / topic 이라는 경로를 구독하고있는 존재
1) 클라이언트에서 메세지를 보내면 일단 먼저 @MessageMapping이 붙은 Controller가 받는다
2) /topic을 destination 헤더로 넣어서 메세지를 바로 송신할 수 도 있고
3) /app을 destination 헤더로 넣어서 서버 내에서 가공을 줄 수 있음
4) 서버가 가공을 완료했으면, 메시지를 /topic이란 경로를 담아서 다시 전송하면
5) SimpleBroker에게 전달되고
6) simpleBroker는 전달받은 메세지를 구독자들에게 최종적으로 전달하게 됨
'CS' 카테고리의 다른 글
| [CS] 메모리 계층 (0) | 2022.10.31 |
|---|---|
| [CS] 운영체제와 컴퓨터 (0) | 2022.10.30 |
| [CS] WebSocket (0) | 2022.10.29 |
| [CS] 선언형과 함수형 프로그래밍 (0) | 2022.10.22 |
| [CS] MVC, MVP, MVVM 비교 해보기 (0) | 2022.10.21 |