-
STOMP, Simple Text Oriented Messaging Protocol
WebSocket은 Text, Binary 두 가지 타입의 메시지만 주고 받을 수 있고 메시지의 내용에 대해서는 형식이 정해져있지 않습니다.
이 때문에 메시지 전송을 효율적으로 하기 위해 탄생한 프로토콜이 STOMP 입니다.
STOMP는 frame 기반의 프로토콜이며 command - header - body 구조로 되어있습니다.
또한 STOMP는 publish - subscribe 의 형태로 메시지를 전송 / 구독하여 처리합니다.
STOMP frame 구조
COMMAND header1:value1 header2:value2 Body^@
- Command
클라이언트 command는 CONNECT, SEND, SUBSCRIBE, UNSUBSCRIBE, BEGIN, COMMIT, ABORT, ACK, NACK, DISCONNECT 등이 있습니다.
서버 command에는 CONNECTED, MESSAGE, RECEIPT, ERROR 등이 있습니다.- CONNECT : 클라이언트 연결 시작합니다.
CONNECT accept-version:1.0,1.1,2.0 host:stomp.github.org ^@
- CONNECTED : 서버가 연결 시도를 수락하면 CONNECTED로 응답합니다.
CONNECTED version:1.2 ^@
- ERROR : 서버가 연결을 거부한 경우 ERROR 프레임에 거부 이유 담아서 응답을 권장합니다.
ERROR version:1.2,2.1 content-type:text/plain Supported protocol versions are 1.2 2.1^@
- SEND : 메시지 전송합니다.
SEND destination:/queue/a content-type:text/plain hello queue a ^@
* destination : 메세지의 목적지
* content-type : body type
- SUBSCRIBE : 메시지를 구독할 수 있습니다.
SUBSCRIBE id:0 destination:/queue/foo ack:client ^@
* destination : 구독할 대상 지정
* ack : 메시지 소비 방식 정의 auto / client
- auto
기본값이며 클라이언트가 메시지를 수신할 때마다 자동으로 서버에 ack을 보냅니다.
이 경우 클라이언트의 별도의 확인 절차 없이 수신하는 즉시 해당 메시지가 처리된 것으로 서버에 전달합니다.
- client, client-individual
클라이언트가 명시적으로 ack 프레임을 전송해야만 서버에서 메시지가 확인된 것으로 간주합니다.
* client : 여러 메시지를 묶어서 ack 전송 가능
* client-individual : 각 메시지마다 ack 전송
Publish - Subscribe
pub / sub 방식은 특정 주제(Topic)에 대해 메시지를 발행(publish)하고, 그 주제에 대해 구독(subscribe)한 클라이언트들이 그 메시지를 수신하는 구조입니다.
- 발행(Publish):
- 발행자는 특정 주제(토픽)에 대해 메시지를 전송합니다.
- 구독(Subscribe):
- 구독자는 특정 주제를 구독하여, 그 주제에 대해 발행된 메시지를 수신합니다.
- 여러 구독자가 동일한 주제를 구독할 수 있으며, 그 경우 동일한 메시지를 모두 수신합니다.
- 토픽(Topic):
- 발행자와 구독자 간의 연결점입니다. 메시지가 발행되고 구독되는 특정 주제입니다.
- 예를 들어, 채팅방을 하나의 토픽으로 간주할 수 있습니다.
참고
- 발행(Publish):