25.03.26 TIL STOMP

신성훈·2025년 3월 26일
0

TIL

목록 보기
156/162

오늘은 STOMP(Simple Text Oriented Messaging Protocol)에 대해 공부 했습니다. STOMP는 WebSocket을 기반으로 동작하며 메시지 라우팅 및 Pub/Sub(발행/구독) 기능을 제공하는 메시징 프로토콜이다.


1. STOMP란?

  • WebSocket 위에서 동작하는 메시지 프로토콜로 텍스트 기반 메시징을 지원
  • 클라이언트와 서버 간 비동기 메시지 교환을 가능하게 함
  • 채팅, 알림 시스템, 실시간 대시보드 등에 사용됨

2. WebSocket vs STOMP

비교 항목WebSocketSTOMP
프로토콜저수준(Binary/Text)고수준 메시징 프로토콜
메시징 방식단순 데이터 송수신메시지 라우팅, Pub/Sub 지원
프레임 구조명확한 규칙 없음CONNECT, SEND, SUBSCRIBE 등 명확한 프레임 제공
사용 예1:1 채팅, 단순 실시간 업데이트그룹 채팅, 알림 시스템, 메시지 브로커 연동
  • STOMP를 사용하면 메시지의 목적지를 지정하고 여러 클라이언트가 동일한 메시지를 구독할 수 있다.

3. Spring WebSocket + STOMP 적용

1) WebSocket 설정 (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/** 경로의 메시지를 구독한 클라이언트들에게 전달

2) 메시지 컨트롤러 (ChatController.java)

@RestController
public class ChatController {
    @MessageMapping("/chat.sendMessage")  // 클라이언트에서 전송한 메시지를 처리
    @SendTo("/topic/public")  // 모든 구독자에게 메시지 전달
    public ChatMessage sendMessage(ChatMessage message) {
        return message;
    }
}
  • 클라이언트가 /app/chat.sendMessage로 메시지를 보내면 /topic/public을 구독한 클라이언트에게 전달됨

3) 메시지 모델 (ChatMessage.java)

public class ChatMessage {
    private String sender;
    private String content;
    private MessageType type;
}
  • 클라이언트 간 메시지를 주고받기 위한 모델

4. STOMP 메시지 전송 과정

1) 클라이언트가 WebSocket을 통해 연결 (/ws 엔드포인트)
2) 서버와 STOMP 핸드셰이크(Handshake) 진행
3) 클라이언트가 /app/chat.sendMessage로 메시지 전송
4) ChatController에서 메시지를 받아 /topic/public으로 배포
5) /topic/public을 구독한 모든 클라이언트가 메시지 수신

  • STOMP의 Pub/Sub 구조를 활용하면 여러 클라이언트가 동일한 메시지를 구독하여 수신할 수 있다.

5. STOMP의 장점과 단점

장점

  • WebSocket보다 메시징 관리가 쉬움 (프레임 제공)
  • 여러 클라이언트가 메시지를 구독 가능

단점

  • WebSocket보다 구현이 복잡함
  • 브로커 설정이 필요할 수도 있음 (대규모 서비스에서는 Kafka 활용)

6. 마무리

STOMP를 사용하면 WebSocket보다 더 체계적인 메시지 라우팅과 다중 클라이언트 지원이 가능하다는 점이 흥미로웠다. 앞으로 Redis Pub/Sub을 활용한 확장형 STOMP 아키텍처**도 학습해봐야겠다.

profile
조급해하지 말고, 흐름을 만들고, 기록하면서 쌓아가자.

0개의 댓글