STOMP란 무엇인가 – 웹소켓을 더 구조화하기 위한 프로토콜
STOMP (Simple Text Oriented Messaging Protocol) 는 텍스트 기반의 경량 메시징 프로토콜로, 웹소켓 상에서 메시지를 주고받을 때 구조적이고 표준화된 방식으로 통신을 가능하게 해주는 프로토콜임.
웹소켓이 단순한 통신 채널이라면, STOMP는 그 위에서 주제(topic), 구독(subscription), 전송(send), 연결 관리 등을 정의하는 규약임.
Spring Framework에서는 STOMP를 통해 복잡한 웹소켓 로직을 단순화하고, 채팅, 실시간 알림, 브로커 연동 등을 쉽게 구현할 수 있음.
1. 왜 STOMP를 사용하는가?
웹소켓 자체는 프레임 단위로 데이터를 주고받는 낮은 수준의 통신 프로토콜임.
예를 들어 채팅방 구독, 메시지 전송, 해제 등은 웹소켓만으로는 구현이 복잡함.
STOMP는 이러한 문제를 해결하기 위해 다음과 같은 구조를 제공함:
- CONNECT: 연결 요청
- SUBSCRIBE: 주제(Topic) 구독
- SEND: 메시지 전송
- UNSUBSCRIBE: 주제 구독 해제
- DISCONNECT: 연결 종료
이러한 명령어를 사용하여 클라이언트와 서버 간의 메시지 흐름을 명확하게 정의할 수 있음.
2. Spring WebSocket + STOMP 아키텍처
Spring에서 STOMP를 사용하는 구조는 다음과 같음:
클라이언트 → 웹소켓 연결(STOMP) → Spring MessageBroker → 핸들러 or 브로커 → 구독 클라이언트
구성 요소
구성 요소 | 설명 |
STOMP 클라이언트 | 웹소켓을 통해 STOMP 메시지를 전송하는 브라우저 혹은 앱 |
Message Broker | 메시지를 라우팅하는 역할 (내장 or 외부 브로커) |
@MessageMapping | 클라이언트가 보내는 메시지를 처리하는 컨트롤러 메서드 |
@SendTo | 처리된 메시지를 구독자에게 전송할 대상 주제 설정 |
3. Spring Boot STOMP 기본 설정 예제
1) 의존성 추가
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
2) WebSocketConfig 설정
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/topic"); // 메시지 송신용
registry.setApplicationDestinationPrefixes("/app"); // 메시지 수신용
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws") // 연결용 엔드포인트
.setAllowedOriginPatterns("*")
.withSockJS(); // SockJS fallback 지원
}
}
4. 메시지 처리 컨트롤러 작성
@Controller
public class ChatController {
@MessageMapping("/chat/message") // 클라이언트가 전송할 경로
@SendTo("/topic/room") // 구독자에게 전송될 경로
public ChatMessage sendMessage(ChatMessage message) {
return message;
}
}
5. 클라이언트(STOMP.js) 코드 예시
const socket = new SockJS("/ws");
const stompClient = Stomp.over(socket);
stompClient.connect({}, function (frame) {
stompClient.subscribe('/topic/room', function (msg) {
console.log("수신: ", JSON.parse(msg.body));
});
stompClient.send("/app/chat/message", {}, JSON.stringify({
sender: "사용자",
content: "안녕하세요"
}));
});
6. 실무 활용 사례
- 실시간 채팅 시스템
- 여러 사용자가 동시에 참여하는 채팅방에서 STOMP 주제를 통해 메시지를 브로드캐스트함.
- 주식/코인 실시간 시세 스트리밍
- 사용자별 관심 종목에 대한 실시간 정보 제공 가능.
- 알림 시스템
- 특정 사용자 또는 전체 사용자에게 푸시 메시지를 전송함.
- IoT 장비 상태 모니터링
- 디바이스 상태를 주제별로 스트리밍하고 모니터링 시스템과 연결 가능함.
7. 장단점 정리
항목 | 장점 | 단점 |
구조화된 메시지 전송 | 명확한 명령어 기반으로 메시지 흐름 관리 | STOMP 프로토콜 이해가 필요함 |
구독 기반 메시지 처리 | 다수 구독자에게 실시간 브로드캐스트 용이 | 클라이언트에서 STOMP.js 사용 필요 |
Spring과 통합 쉬움 | 보안, 인증 처리 등 별도 구성 필요 | |
다양한 메시지 브로커와 연동 가능 | RabbitMQ, ActiveMQ 등 연동 시 추가 설정 필요 |
정리
STOMP는 웹소켓을 활용할 때 메시지 통신을 보다 체계적으로 구조화할 수 있는 프로토콜임.
Spring Boot에서는 @EnableWebSocketMessageBroker 와 @MessageMapping 을 통해 쉽게 구현 가능함.
실시간 채팅, 알림, 데이터 스트리밍 시스템 등에 적합하며, 구독 기반 구조를 통해 다수 사용자와 안정적인 통신을 구현할 수 있음.
출처 : ChatGPT
'BE > Spring & Spring Boot' 카테고리의 다른 글
[Spring Boot] Redis pub/sub (0) | 2025.04.27 |
---|---|
모놀리식 아키텍처와 MSA (0) | 2025.04.24 |
[Spring Boot] Spring JDBC (0) | 2025.04.22 |
[Spring Boot] 웹소켓 (1) | 2025.04.19 |
[Spring Boot] @CacheEvict (0) | 2025.04.15 |