STOMP란?
STOMP는 단순(또는 스트리밍) 텍스트 지향 메시징 프로토콜입니다.
STOMP는 상호 운용 가능한 와이어 포맷을 제공하여 STOMP 클라이언트가 모든 STOMP 메시지 브로커와 통신할 수 있도록 하며, 다양한 언어, 플랫폼 및 브로커 간에 쉽고 광범위한 메시징 상호 운용성을 제공합니다.
STOMP는 HTTP 디자인 학교에서 나온 매우 간단하고 구현하기 쉬운 프로토콜입니다. 서버 측은 잘 구현하기 어려울 수 있지만, 클라이언트를 작성하여 연결하는 것은 매우 쉽습니다. 예를 들어 Telnet을 사용하여 모든 STOMP 브로커에 로그인하고 상호 작용할 수 있습니다!
-STOMP 공식 사이트
STOMP의 주요 특징
텍스트 기반 프로토콜:
STOMP는 간단한 텍스트 기반 프로토콜로, HTTP와 유사하게 사람이 읽을 수 있는 형식으로 요청과 응답을 주고받는다.
이로 인해 디버깅과 테스트가 비교적 용이하다.
- 프로토콜(Protocol): 컴퓨터 네트워크에서 데이터를 주고받기 위한 규칙이나 약속을 의미
클라이언트-서버 메시지 브로커 모델:
STOMP는 클라이언트가 메시지를 서버(보통 메시지 브로커)로 전송하고, 서버가 이를 적절한 대상에 전달하는 메시지 브로커 모델을 기반으로 한다.
주로 메시지 브로커에서 클라이언트 간의 메시지 전달, 즉 퍼블리셔와 구독자 간의 통신을 가능하게 한다.
메시징 모델의 유연성:
STOMP는 Publish/Subscribe 모델과 Point-to-Point 모델을 모두 지원한다.
- Publish/Subscribe 모델: 여러 클라이언트가 특정 주제를 구독할 수 있고, 그 주제로 전송된 메시지를 동시에 받을 수 있다.
- Point-to-Point 모델: 메시지가 큐를 통해 특정 클라이언트에만 전달된다.
웹소켓(WebSocket)과의 호환성:
STOMP는 웹소켓 위에서 동작할 수 있어, 웹 애플리케이션에서 실시간 메시징을 지원하기에 적합한다.
웹소켓은 서버와 클라이언트 간의 양방향 통신을 가능하게 하며, STOMP는 이를 통해 클라이언트와 브로커 간의 메시징을 간소화한다.
메시지 헤더 지원:
STOMP는 HTTP와 유사한 헤더 구조를 사용하여 메시지에 메타데이터를 포함할 수 있다.
이 헤더를 통해 메시지의 ID, 우선순위, 목적지 등을 설정할 수 있다.
WebSocket과 STOMP의 차이는?
WebSocket
WebSocket은 연결 유지와 실시간 통신에 중점을 둔다. 연결이 수립되면 클라이언트와 서버가 데이터 교환을 자유롭게 할 수 있습니다.
데이터 형식이나 라우팅 규칙을 별도로 정의해야 하므로, 기본적인 양방향 데이터 송수신 기능을 제외하고는 추가 개발이 필요합니다.
주로 실시간 게임, 주식 시세, 실시간 채팅 등 빠른 데이터 전송이 필요한 서비스에서 사용된다.
STOMP
STOMP는 메시지 전송과 구독 관리에 중점을 두며, WebSocket과 함께 사용될 때 메시징 프로토콜 역할을 한다.
STOMP는 SUBSCRIBE와 SEND와 같은 명령어를 통해 클라이언트가 특정 주제를 구독하고 메시지를 발행할 수 있게 해주며, 다수의 클라이언트가 특정 주제에 메시지를 동시에 수신하도록 지원한다.
주로 메시지의 목적지 구분(주제 또는 큐), 다수 클라이언트 간의 메시지 브로드캐스트, 신뢰성 있는 메시징 시스템이 필요한 상황에서 유용하게 사용된다.
채팅 서비스로 예를 들자면
WebSocket만 사용하는 경우
클라이언트와 서버 간의 연결은 WebSocket으로 유지한다.
사용자가 특정 채팅방에 들어오면 서버에 연결하고, 서버는 각 클라이언트를 특정 채팅방에 매핑하여 라우팅해야 합니다. 새로운 메시지를 모든 사용자에게 브로드캐스트하려면 채팅방별로 별도의 코드 구현이 필요합니다.
WebSocket + STOMP를 사용하는 경우
WebSocket 위에서 STOMP를 사용해 SUBSCRIBE로 클라이언트가 채팅방 주제(/topic/room1 등)에 구독합니다.
클라이언트는 SEND 명령어로 특정 주제로 메시지를 전송하고, 서버는 이 메시지를 해당 주제를 구독한 모든 클라이언트에게 자동으로 전달합니다.
메시지 라우팅과 채팅방 관리가 STOMP 명령어로 간단하게 처리됩니다
.
STOMP를 사용한 메시징 흐름 예제
예를 들어, 채팅 애플리케이션에서 STOMP를 사용하는 경우의 메시지 흐름은 다음과 같다:
1. 클라이언트가 서버에 연결:
클라이언트는 CONNECT 명령어를 통해 STOMP 서버에 연결을 요청한다.
2. 클라이언트가 특정 주제 구독:
클라이언트는 SUBSCRIBE 명령어를 통해 특정 채팅방(예: /topic/chat.room1)을 구독한다.
3. 클라이언트가 메시지 전송:
다른 사용자가 메시지를 전송할 때 SEND 명령어를 사용하여 /topic/chat.room1 주제에 메시지를 보낸다.
STOMP 서버는 이 메시지를 구독한 모든 클라이언트에게 전달합니다.
4. 메시지 수신 및 ACK:
구독한 클라이언트들은 메시지를 수신하고, 필요에 따라 서버에 ACK를 보내 메시지를 성공적으로 처리했음을 알린다.
- ACK(Acknowledge): 메시지를 수신한 클라이언트가 메시지 브로커에게 “메시지를 성공적으로 수신하고 처리했다”는 확인을 보내는 프로세스
5. 연결 종료:
채팅을 종료하거나 연결을 끊을 때, 클라이언트는 DISCONNECT 명령어를 전송해 연결을 종료한다.
STOMP의 사용 사례
실시간 채팅 애플리케이션: 여러 사용자가 동시에 메시지를 주고받아야 하는 경우, STOMP를 사용하면 웹소켓을 통해 실시간 메시징이 가능해진다.
알림 시스템: 사용자가 웹 애플리케이션을 사용하는 동안 실시간으로 알림을 받을 수 있도록 한다.
IoT 시스템: IoT 장치 간의 메시징을 위해 STOMP를 사용해 데이터를 전송하고, 이벤트를 수신할 수 있다.
실시간 피드: 주식 시세나 뉴스 업데이트 등 실시간 정보 제공 애플리케이션에서 STOMP를 사용해 데이터를 전송할 수 있다.
STOMP는 간단한 구조와 텍스트 기반의 메시징 프로토콜로, 웹 애플리케이션에서 실시간 양방향 통신을 구현할 때 매우 유용하다. 이를 통해 다양한 메시징 요구사항을 쉽게 해결할 수 있으며, 특히 WebSocket과 결합하여 실시간 애플리케이션에 적합한 솔루션을 제공한다.
'STOMP' 카테고리의 다른 글
STOMP 포멧 종류 (0) | 2024.11.29 |
---|