
STOMP(스트리밍 텍스트 지향 메시지 프로토콜)은 웹 애플리케이션과 메시지 브로커(RabbitMQ, Apache Kafka 등) 간의 상호 작용을 위한 간단하고 유연한 메시징 프로토콜이다. 이 프로토콜은 HTTP와 같은 웹 통신 프로토콜 위에서 작동하며, 주로 웹 소켓과 함께 사용되 실시간 통신을 지원한다.
웹소켓(WebSocket)은 TCP 기반의 양방향 통신을 지원하는 프로토콜이다. 웹소켓을 사용하면 클라이언트와 서버 간에 실시간으로 데이터를 주고 받을 수 있다. 그러나 웹소켓 자체는
데이터를 어떻게 구조화 하고 전송할지에 대한 규약을 정의하지 않는다.
1. 웹소켓만을 사용한 예제
클라이언트 --> "Hello, Server!" --> 서버
서버 --> "Hi, Client!" --> 클라이언트
2. 웹소켓과 STOMP를 함께 사용한 예제
클라이언트 --> SEND /app/message {"content":"Hello, Server!"} --> 서버
서버 --> RECEIPT /app/message/1234 --> 클라이언트
서버 --> MESSAGE /topic/messages {"content":"Hi, Client!"} --> 클라이언트
위 예제에서 볼수 있듯, STOMP를 사용하면 클라이언트와 서버 간의 메시지를 보내고 받는 방식이 명확해진다. 클라이언트는 SEND 명령어를 사용하여 메시지를 보내고, 서버는 MESSAGE 명령어를 사용하여 클라이언트에게 메시지를 전달한다. 이렇게
구조화된 메시지 프로토콜을 사용하면 클라이언트와 서버 간의 통신을 더 쉽게 이해하고 구현하게 해준다.
STOMP에서는 클라이언트가 특정 주제(topic)나 큐(queue)에 대해 구독(subscribe)을 요청할 수 있다. 이 후 메시지 브로커는 해당 주제나 큐에 새로운 메시지가 발행(publish)되면 해당 클라이언트에게 메시지를 전송한다.
단순히 WebSocket만 사용해서 통신을 하게 될경우 모든 메시지가 서버를 거치지 않고 클라이언트 간에 직접 전달되므로, 서버에서 메시지의 라우팅이나 관리가 어렵다. 또한 새로운 클라이언트가 접속하거나 연결이 끊길 때마다 모든 클라이언트에게 이벤트를 수신하도록 설정을 해야한다.
이런 방식으로 메시지 브로커는 Pub/Sub 패턴을 사용하여 클라이언트 간의 효율적인 메시지 교환을 담당한다. 클라이언트는 특정 채널 또는 주제에 대해 구독하고, 해당 주제에 대한 메시지를 전송하는 발행자가 메시지를 보내면 메시지 브로커를 통해 메시지를 받는다.