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 동작방식

  1. 클라이언트가 메시지를 전달

    1. /app : 애플리케이션으로 보내는 내용

    2. /topic : 브로커로 보내는 내용

  2. Request Channel에서 클라이언트의 url에 따라 요청내용을 분기 처리

  3. 클라이언트가 /app으로 요청한 경우 SimpAnnotationMethodMessageHandler에 의해 요청내용이 처리됨

    1. 처리결과는 Broker에게 전달

  4. 클라이언트가 /topic으로 요청한 경우 메시지가 브로커에게 바로 위임된다.

  5. 브로커는 구독정보를 기준으로 메시지를 사용자에게 전달한다.

  6. 메시지를 전달받은 사용자는 subscribe로 등록한 콜백함수를 실행한다.

Last updated