오늘은 STOMP(Simple Text Oriented Messaging Protocol)에 대해 공부 했습니다. STOMP는 WebSocket을 기반으로 동작하며 메시지 라우팅 및 Pub/Sub(발행/구독) 기능을 제공하는 메시징 프로토콜이다.
| 비교 항목 | WebSocket | STOMP |
|---|---|---|
| 프로토콜 | 저수준(Binary/Text) | 고수준 메시징 프로토콜 |
| 메시징 방식 | 단순 데이터 송수신 | 메시지 라우팅, Pub/Sub 지원 |
| 프레임 구조 | 명확한 규칙 없음 | CONNECT, SEND, SUBSCRIBE 등 명확한 프레임 제공 |
| 사용 예 | 1:1 채팅, 단순 실시간 업데이트 | 그룹 채팅, 알림 시스템, 메시지 브로커 연동 |
WebSocketConfig.java)@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic"); // 메시지 구독 (브로커 역할)
config.setApplicationDestinationPrefixes("/app"); // 클라이언트 메시지 전송 경로
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws").setAllowedOrigins("*").withSockJS(); // WebSocket 연결 설정
}
}
/ws 엔드포인트로 STOMP WebSocket 연결을 설정/topic/** 경로의 메시지를 구독한 클라이언트들에게 전달ChatController.java)@RestController
public class ChatController {
@MessageMapping("/chat.sendMessage") // 클라이언트에서 전송한 메시지를 처리
@SendTo("/topic/public") // 모든 구독자에게 메시지 전달
public ChatMessage sendMessage(ChatMessage message) {
return message;
}
}
/app/chat.sendMessage로 메시지를 보내면 /topic/public을 구독한 클라이언트에게 전달됨 ChatMessage.java)public class ChatMessage {
private String sender;
private String content;
private MessageType type;
}
1) 클라이언트가 WebSocket을 통해 연결 (/ws 엔드포인트)
2) 서버와 STOMP 핸드셰이크(Handshake) 진행
3) 클라이언트가 /app/chat.sendMessage로 메시지 전송
4) ChatController에서 메시지를 받아 /topic/public으로 배포
5) /topic/public을 구독한 모든 클라이언트가 메시지 수신
장점
단점
STOMP를 사용하면 WebSocket보다 더 체계적인 메시지 라우팅과 다중 클라이언트 지원이 가능하다는 점이 흥미로웠다. 앞으로 Redis Pub/Sub을 활용한 확장형 STOMP 아키텍처**도 학습해봐야겠다.