Friendship의 채팅 시스템은 웹소켓의 프로토콜의 일종인 STOMP 프로토콜을 사용하여 웹소켓을 통해 실시간으로 메시지를 교환합니다. Pub/Sub (Publish-Subscribe)
모델을 따르며, 이를 통해 사용자는 채팅방(chatRoom
)에 메시지를 게시하고, 해당 채팅방의 메시지를 구독하는 형태를 따릅니다!
<aside> 💡 목차
</aside>
<aside> 🍊 Pub/Sub 구조란?
채팅 구조를 보여드리기 전에, 앞으로 언급될 Pub/Sub 구조에 대한 이해가 필요한데요. 혹시 제 설명이 부족하다면 질문해주시면 답변 드릴 수 있도록 하겠습니다!
먼저 Pub/Sub이란 'Publisher-Subscriber', 즉 '발행자와 구독자'의 약자입니다. 이름에서 알 수 있듯이 한쪽에서 메시지를 전달하는 발행자와, 그 메시지를 받는 구독자가 있는 구조를 말하는 거죠.
이걸 이해하기 쉽게, 우리 일상에서 흔히 볼 수 있는 뉴스레터 시스템에 비유해보면 좋을 것 같아요. 뉴스레터를 작성하고 보내는 회사를 **발행자
**로, 뉴스레터를 받아보는 우리를 **구독자
**로 생각하면 됩니다.
그럼 여기서 '토픽
'이라는 개념이 등장하는데요, 이를 뉴스레터의 '주제'라고 생각하면 됩니다. 예를 들어, '여행', '요리', '건강' 등 다양한 주제의 뉴스레터가 있을 수 있죠. 우리는 관심 있는 주제를 선택해서 그 주제의 뉴스레터만 받을 수 있습니다. 이렇게 선택한 주제가 바로 '토픽'입니다.
그럼 뉴스레터가 어떻게 우리에게 도착하는지 궁금하실 수 있어요. 이때 중요한 역할을 하는 것이 '메시지 브로커
'입니다. 이를 우체국에 비유해볼게요. 발행자는 뉴스레터를 작성해서 우체국(메시지 브로커)에 보내고, 우체국은 그 뉴스레터 토픽을 구독한 우리에게 배달합니다. 우체국이 없다면(일반 웹소켓 방식) 발행자가 직접 각 구독자에게 뉴스레터를 전달해야 하겠죠? 그러나 우체국(메시지 브로커) 덕분에 발행자는 단순히 뉴스레터를 보내기만 하면 되는 구조가 됩니다!
그럼 FriendShip의 채팅은 어떤 식으로 Pub/Sub 구조를 적용할 수 있을까요?
각 채팅방의 사용자가 “채팅방”이라는 토픽을 구독하도록하고, 메시지 전송 요청 때마다 메시지(뉴스레터)를 “채팅방” 토픽에 발행하는거에요. 그럼 같은 “채팅방”을 구독하고 있는 사용자는 해당 메시지(뉴스레터)를 “메시지브로커”로부터 비동기적으로 받아볼 수 있게 되는거죠.
이 다음부터는 기본적인 메시지 전송/수신 구조부터 살펴볼 수 있도록 할게요.
</aside>
주요 구성 요소 설명
위의 그림을 간단하게 3단계로 나누어 설명하겠습니다!
/topic/chatRoom/{chatRoomId
)에 대한 구독을 요청합니다./app/chat
엔드포인트를 통해 메시지를 서버에 전송합니다.
chatRoomId
**의 토픽에 게시합니다.