SockJS와 STOMP

웹소켓은 특정 네트워크 환경(브라우저/프록시/방화벽)에서는 제대로 동작되지 않을 수 있다. 다양한 환경에서 실시간 통신 및 Websocket Fallback을 지원하는 것이 SockJS이다.

STOMP(Simple Text Oriented Messaging Protocol) 는 메시지 브로커와의 Pub/Sub 통신을 지원하는 단순 텍스트 기반 프로토콜이다.

이것들을 이용해 웹소켓을 이용한 실시간 통신을 스프링으로 구현해보자.


웹소켓 설정

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
 
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/chat").withSockJS(); // 연결 엔드포인트
    }
 
    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.enableSimpleBroker("/topic"); // 브로커가 메시징 처리
        registry.setApplicationDestinationPrefixes("/app"); // @MessageMapping을 이용해 서버가 직접 처리
    }
}

어노테이션

@MessageMapping 은 메시지 수신 지점을 정의하고, @SendTo반환 데이터를 전송할 지점을 정의하고, @SubscribeMapping 은 최초 구독후 일회성 응답하고, @MessageExceptionHandler 는 메시징 처리 중 예외 발생시 에러 메시지를 전송하고, @Payload@Header 로 메시지 내용을 파라미터 바인딩할 수 있다.

Bean

  • SimpMessagingTemplate: 특정 경로로 메시지를 전송(비동기 이벤트 처리)
  • SimpUserRegistry: 연결된 세션 및 유저 관리
  • SimpSessionRegistry: 유저의 세션 관리(여러 기기에 접속한 유저 추적)
  • HandshakeInterceptor: 커스텀 인증 및 연결 정보 추가