Spring/Spring Stomp

[Stomp] Spring Boot with React 채팅 서버 : 3-2. Stomp 기본 설정

noahkim_ 2022. 3. 14. 02:33

1. WebSocketConfig.java

  • 중요한 내용은 주석에 달려있음
  • @EnableWebSocketMessageBroker
    • websocket의 구현체를 사용할 경우 (대표적으로 stomp) 설정파일에 붙여줌
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {

        // socketJs 클라이언트가 WebSocket 핸드셰이크를 하기 위해 연결할 endpoint를 지정할 수 있다.
        registry.addEndpoint("/chat/inbox")
                .setAllowedOriginPatterns("*") // cors 허용을 위해 꼭 설정해주어야 함. setCredential() 설정시에 AllowedOrigin 과 같이 사용될 경우 오류가 날 수 있으므로 OriginPatterns 설정으로 사용하였음
                .addInterceptors(new StompHandshakeInterceptor()) // 핸드쉐이크시 인터셉터를 넣을 수 있음
                .withSockJS()
                .setDisconnectDelay(30 * 1000)
                .setClientLibraryUrl("https://cdnjs.cloudflare.com/ajax/libs/sockjs-client/1.5.1/sockjs.min.js"); // 프론트에서 사용하는 sockjs 라이브러리와 동일하게 사용하였음
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        // 클라이언트로부터 메시지를 받을 api의 prefix를 설정함
        // publish
        registry.setApplicationDestinationPrefixes("/pub");

        // 메모리 기반 메시지 브로커가 해당 api를 구독하고 있는 클라이언트에게 메시지를 전달함
        // to subscriber
        registry.enableSimpleBroker("/sub");

    }
}

 

2. StompHandshakeInterceptor.java

  • HandshakeInterceptor를 구현하여 사용함
    • 추가적으로 사용되며 handskake의 after, before 정보를 가로챌 수 있다
    • beforeHandshake() 함수는 무조건 retrun 값을 true로 해야 handshake가 이루어진다.
      (처음 오버라이딩 된 디폴트 값이 false여서 바꾸어 주지 않다가 10시간을 날렸다ㅠㅠ)
@Slf4j
@Component
public class StompHandshakeInterceptor implements HandshakeInterceptor {
    @Override
    public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {
        log.info("stomp handshake start");
        return true;
    }

    @Override
    public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) {
        log.info("stomp hadnshake success!");
    }
}

 

3. StompEventListener.java

  • websocket이 연결되고 끊어질 때 이벤트 리스너를 달아 로그로 찍을 수 있다
@Component
@Slf4j
public class StompEventListener {

    @EventListener
    public void handleWebSocketConnectListener(SessionConnectedEvent event) {

        StompHeaderAccessor headerAccessor = StompHeaderAccessor.wrap(event.getMessage());
        String sessionId = headerAccessor.getSessionId();

        log.info("[Connected] websocket session id : {}", sessionId);
    }

    @EventListener
    public void handleWebSocketDisconnectListener(SessionDisconnectEvent event) {

        StompHeaderAccessor headerAccessor = StompHeaderAccessor.wrap(event.getMessage());
        String sessionId = headerAccessor.getSessionId();

        log.info("[Disconnected] websocket session id : {}", sessionId);
    }
}