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: 커스텀 인증 및 연결 정보 추가