Skip to content

[DOC/CHAT] STOMP 와 PUB SUB에 대해 #18

@Cassiiopeia

Description

@Cassiiopeia

💡 Description


STOMP

Simple Text Oriented Message Protocol

메시지 전송을 효율적으로 하기 위한 프로토콜입니다. 

기본적으로 PUB SUB 구조로 되어있습니다.

클라이언트와 서버가 전송할 메세지의 유형, 형식, 내용들을 정의하는 매커니즘입니다.

웹소켓 위에 얹어 함께 사용할 수 있습니다.  

메세지의 헤더에 값을 줘서 인증 처리를 구현하는 것도 가능합니다.
( 프론트엔드에서 stompClient.connect() 할시 정의합니다 )

PUB / SUB

메시지를 공급하는 주체 / 소비하는 주체 분리해 제공하는 메시징 방법입니다.

Publish하는 게시자 / Subscribe하는 구독자 를 의미하는데요. 

게시자는 메시지를 보내는 구성요소입니다. 

게시자는 주제에 대한 메시지를 작성하여 해당 주제의 모든 구독자들에게 전송합니다. 

게시자는 브로드캐스트 중인 정보를 누가 사용하고 있는지 알필요가없습니다.

구독자는 메시지 출처를 알 필요가없습니다.

구독자는 메시지 수신자입니다. 구독자는 관심있는 주제에 구독을 해야합니다.

image

OUR Project

딱딱한 이론이 잘 이해가 안되실수도있습니다.

저희 프로젝트에서는 SpringBoot를 사용하여 채팅 메시지 를 구현합니다.

우체통에 대한 예시를 보니 잘 이해가 되더군요

우체통(Topic) 이 있다면 집배원(Publisher)이 신물을 우체통에 배달하는 행위가 있고 

우체통에 신문(Message)이 배달되는것을 기다렸다가 보는 구독자(Subscriber)가 있습니다.

이를 저희 프로젝트에 비유하자면

채팅방을 생성하는것은 우체통(Topic)을 만드는 것이고 

채팅방에 들어가는것은 구독자(Subscriber)가 되는것입니다.

채팅방에 채팅을 보내면 게시자(Publisher)가 됩니다.

SpringBoot 위에 PUB/SUB 메시징 패턴의 일종으로 STOMP 프로토콜을 사용합니다.

STOMP는 메시지를 전송하기전에 

이런 SUB / PUB을 미리 지정하여 편리하게 메시지를 관리할수 있게합니다.

여기에서 client는 -> sever 에  메시지를 게시 Publish 하고

다른 client -> 해당 메시지를 구독 Subscribe 하여 실시간으로 데이터를 교환하는 방법을 사용합니다.

HOW?

정확히 어떤식으로 게시하고 구독된 client에게 메시지를 보내는지 궁금하실것 같은데요

'''프론트엔드쪽 예시코드 :
stompClient.send(`/chats/chatrooms/${currentChatRoomId}/messages`, {}, JSON.stringify(chatMessage));
'''
*** 이때 "/chats"는 웹소켓,STOMP에서 메시지를 수신하거나 발신할 때 사용되는 애플리케이션 대상 접두어입니다)
*** ("/chats" 는 WebSocketConfig안에서 정의해 놓은것이며 메시지 브로커 설정에서 Client가 메시지를 보낼때 사용하는 "주소"의 접두어 입니다.
*** 저희가 HTTP RESTful 웹서비스에서 사용하는 @RequestMapping와 유사하지만 웹소켓, STOMP에서 쓰는 접두어 설정입니다)

Client(Sender)가 다음과 같이 정해진 채팅방주소를 목적지로 하여 채팅 메시지를  보냅니다. 

그러면 메시지는 STOMP 프로토콜로 서버에 메시지가 전달됩니다.

'''
@MessageMapping("/chatrooms/{chatRoomId}/messages")
'''

서버의 Controller에 있는 @MessageMapping으로 정의해놓은 채팅방주소에 따라서 서버는 보내진 메시지를 받습니다.  

'''
@SendTo("/chatrooms/{chatRoomId}")

OR

messagingTemplate.convertAndSend("/chatrooms/" + chatRoomId, chatMessage);
'''

같은 Controller단 메소드에서 @SendTo 어노테이션을 사용하여 메시지를 처리하여 구독자들에게 메시지를 전달할수있고

메소드안에서 SimpMessagingTemplate의 convertAndSend() 메소드를 사용해서 주소로 메시지를할 전송 수 있습니다. 

이때 이 주소("/chatrooms/{chatRoomId}") 는 다른 Subscriber (구독자) 들이 구독하고있는 주소입니다.

이 주소를 구독할수있는 Client들은 다수가 될수 있습니다. 

하지만 저희 프로젝트는 1대1 채팅방을 다루기때문에 

하나의 topic(채팅방id) 에 대한 구독주소 는 2명의 client가 구독하게됩니다. 
image

위의 사진을 예시로 하였을때

client들이 하는 구독주소는 "/room" 이고

특정 Topic 은 채팅방번호인 "1"을 의미합니다.


🐶 Technology Stack

PUB / SUB
WebSocket
STOMP


## 📚 References

https://aws.amazon.com/ko/what-is/pub-sub-messaging/

Metadata

Metadata

Assignees

Labels

documentationImprovements or additions to documentation

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions