[스프링] 스프링 WebSocket과 복구 및 예외 처리

스프링을 사용하면 실시간 양방향 통신을 구현하는 WebSocket을 손쉽게 구현할 수 있습니다. 이번 블로그에서는 스프링 WebSocket을 사용하고, 연결 복구 및 예외 상황을 처리하는 방법에 대해 알아보겠습니다.

스프링 WebSocket 설정 및 사용하기

먼저, spring-websocket 모듈을 의존성에 추가하고 WebSocket 설정을 구성해야 합니다. 이후 @EnableWebSocketMessageBroker 어노테이션을 사용하여 설정을 활성화하고, WebSocketMessageBrokerConfigurer를 구현하여 WebSocket 엔드포인트와 메시지 핸들러를 등록할 수 있습니다.

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/ws").withSockJS();
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.enableSimpleBroker("/topic");
        registry.setApplicationDestinationPrefixes("/app");
    }
}

위의 예시에서는 /ws 엔드포인트를 등록하고, 클라이언트에서는 SockJS 를 활용하여 WebSocket 연결을 설정할 수 있습니다.

클라이언트는 이제 Stomp.js 등을 사용하여 메시지를 전송하고 받을 수 있게 됩니다.

연결 복구 처리

웹소켓은 네트워크 상태나 서버 다운 등의 이유로 연결이 끊어질 수 있습니다. 이때, @EnableScheduling 어노테이션을 사용하여 스프링에서 제공하는 SimpMessagingTemplate을 사용하여 주기적으로 클라이언트와 통신하는 태스크를 등록할 수 있습니다. 이를 통해 클라이언트가 연결을 잃었을 때 다시 연결하거나 데이터를 복구할 수 있게 됩니다.

@Service
public class ConnectionRecoveryService {

    private final SimpMessagingTemplate messagingTemplate;

    @Autowired
    public ConnectionRecoveryService(SimpMessagingTemplate messagingTemplate) {
        this.messagingTemplate = messagingTemplate;
    }

    @Scheduled(fixedRate = 5000)
    public void sendHeartbeat() {
        // Send a heartbeat message to the client
        messagingTemplate.convertAndSend("/topic/heartbeat", "keep-alive");
    }
}

위의 예시에서의 sendHeartbeat 메소드는 주기적으로 클라이언트에 keep-alive 메시지를 보내어 연결을 유지하는 역할을 합니다.

예외 처리

때로는 웹소켓 통신 중에 에러가 발생할 수 있습니다. 이때는 @MessageExceptionHandler 어노테이션을 사용하여 예외를 처리하고, 적절한 응답을 클라이언트에 전송할 수 있습니다.

@ControllerAdvice
public class WebSocketExceptionHandler {

    @MessageExceptionHandler
    public void handleException(Exception ex) {
        // Handle the exception and send an appropriate response to the client
    }
}

위의 예시에서, handleException 메소드를 사용하여 클라이언트의 요청을 처리하다가 발생한 예외를 적절히 처리할 수 있습니다.

마치며

스프링 WebSocket을 사용하여 웹소켓 통신을 구현하고, 연결의 복구 및 예외 처리를 다뤄보았습니다. 이러한 기능을 활용하여 안정적이고 안전한 실시간 통신을 구현할 수 있습니다.

끝으로, 추가로 관련된 레퍼런스를 참고하시면 보다 자세한 정보를 얻을 수 있습니다.

레퍼런스

이상으로, 스프링 WebSocket을 활용한 연결 복구 및 예외 처리에 대해 알아보았습니다. 감사합니다.