Stomp
Intro
Websocket기능을 이용하면 웹 애플리케이션에 실시간 기능을 추가할 수 있습니다. 실시간으로 다른 사용자와 채팅을 한다던가, 내 글에 다른 사용자가 댓글을 다는 경우 이를 알림으로 알려주는 기능들이 있죠.
다만 Websocket만 가지고 복잡한 기능을 구현하기는 힘이 듭니다. Websocket은 메시지를 실시간으로 송수신이 가능한 양방향 채널"일 뿐, 메시지의 형식이나 목적을 식별할 수 있는 규약은 존재하지 않습니다.
만약 내가 구현하고자 하는 기능이 특정 채널을 구독하고 있는 사용자에게 채널에 새로운 게시글이 올라올 때 마다 메시지를 발행하는 복잡한기능을 구현하고자 한다면 WebSocket/Sockjs만으로는 개발하기 힘들 수 있습니다.
1. STOMP(Stomp Text Oriented Messageing Protocol)
스톰프는 WebSocket에서 동작하는 텍스트 기반 메세징 프로토콜로 웹소켓을 활용한 복잡한 기능을 구현하고자 할 때 사용합니다.
STOMP메시지 프레임 구조)
command: SEND
destination:/chat/message
content-type:application/json
body : {"sender":"kim", "content":"hello"}메시지에 "명령(CONNECT, SUBSCRIBE, UNSUBSCRIBE, SEND, DISCONNECT)", "목적지(Destination)", "헤더설정(content-length, content-type, destination)", "바디(본문)"를 부여해 의미있는 통신을 가능하게 한다.
2. STOMP의 주요 컴포넌트
1. 클라이언트
Websocket서버를 통해 메시지를 서버로 전송하는 주체
직접 메시지를 전달(
send)하거나 특정 채널을 구독(subscribe)하여 메시지를 수신한다.
2. 서버
서버는 클라이언트로부터 받은 메시지를 직접 처리하거나, 메시지를 브로커로 전달하여 다른 클라이언트에게 중계할 수 있도록 하는 컴포넌트
@MessageMapping어노테이션을 통해 클라이언트가 전달하는 메시지를 매핑하고,@SendTo를 통해 메시지를 처리한다.
3. 브로커 (Message Broker)
클라이언트와 서버 사이에 메시지를 라우팅하는 중개자
Spring은 SimpleMessageBroker를 기본브로커로 사용한다.
구독 URL을 관리한다.
3. Message Broker와 구독/발행

STOMP에는 구독과 발행 기능이 존재합니다.
클라이언트는 특정 주제(topic)를 구독하고, 누군가가 그 주제에 메시지를 발행(Publish)하면, 해당 메시지가 구독자들에게 전달됩니다.
이렇게 구독자와 발행자 간에 메시지를 중계하는 역할의 컴포넌트를 Message Broker라고 합니다.
4. STOMP 동작방식

클라이언트가 메시지를 전달
/app: 애플리케이션으로 보내는 내용/topic: 브로커로 보내는 내용
Request Channel에서 클라이언트의 url에 따라 요청내용을 분기 처리
클라이언트가
/app으로 요청한 경우 SimpAnnotationMethodMessageHandler에 의해 요청내용이 처리됨처리결과는 Broker에게 전달
클라이언트가
/topic으로 요청한 경우 메시지가 브로커에게 바로 위임된다.브로커는 구독정보를 기준으로 메시지를 사용자에게 전달한다.
메시지를 전달받은 사용자는 subscribe로 등록한 콜백함수를 실행한다.
Last updated