Spring

[Spring] Spring Boot WebSocket + STOMP 구성요소

경상도상남자 2025. 3. 30. 23:42

✨ Spring Boot WebSocket

Spring Framework에서 제공하는 기능으로, 실시간 양방향 통신을 가능하게 해 준다. Web Socket을 사용하면 서버와 클라이언트 간의 연결이 지속적으로 유지되어, 데이터를 실시간으로 주고받을 수 있다.

주로 채팅 애플리케이션, 실시간 알림 시스템, 주식 거래 플랫폼 등에서 사용

 

소켓 통신이 무엇인지 궁금하시면 아래 소켓 통신 포스팅 글을 참고해 주세요

https://gyeongsangman.tistory.com/139

 

[CS] 소켓 통신 (Socket Communication) 이해하기

✨  소켓 통신(Socket Communication) 이란??네트워크에서 두 컴퓨터 간의 '실시간 양방향 통신'을  제공하는 기술양방향 통신은 송신자 측이 데이터를 수신할 수 있으며, 수신자 측이 데이터를 송신

gyeongsangman.tistory.com

 

https://spring.io/guides/gs/messaging-stomp-websocket

 

Getting Started | Using WebSocket to build an interactive web application

In Spring’s approach to working with STOMP messaging, STOMP messages can be routed to @Controller classes. For example, the GreetingController (from src/main/java/com/example/messagingstompwebsocket/GreetingController.java) is mapped to handle messages t

spring.io

 

 

 

STOMP

텍스트 기반의 메시징 프로토콜을 의미 클라이언트와 메시지 브로커 간의 통신을 간단하고 효율적으로 수행할 수 있도록 설계되었다. 이는 WebScoket에서 쉽게 메시지를 주고받을 때 사용이 된다.
해당 프로토콜은 Websocket을 사용하여 클라이언트와 서버 간의 메시지 교환을 구조화하고 표준화하는 데 사용된다.

 

관련 용어

CONNECT

- 클라이언트가 서버에 연결을 요청할 때 사용

 

SEND 

-클라이언트 또는 서버가 특정 목적지로 메시지를 보낼 때 사용

 

SUBSCRIBE

- 클라이언트가 특정 목적지의 메시지를 구독할 때 사용

 

UNSUBSCRIBE

- 클라이언트가 특정 목적지의 메시지 구독을 취소할  때 사용

 

DISCONNECT

- 클라이언트와 서버와의 연결을 종료할 때 사용

 


 

 

📕 Spring Boot WebSocket 구성요소

 

1. WebSocketConfigurer 인터페이스

- Spring Framework에서 WebSocket 구성을 위한 인터페이스, 이 인터페이스를 구현하면 WebSocket 엔드포인트와 핸들러를 등록할 수 있다.

- 즉, 해당 엔드포인트는 클라이언트가 '웹 소켓을 연결'하기 위한 엔드포인트 이다. Spring Boot Server가 로컬에서 실행하고 8080 포트인 경우 http://localhost:8080/[엔드포인트]로 접근을 하게 된다.

 

🔖 주요 기능

 

WebSocket 엔드포인트 등록

- registerWebSocketHandlers() 메서드를 통해 WebSocket 엔드포인트를 등록

 

핸들러 매핑

- 특정 URL 패턴에 WebSocketHandler를 매핑한다

 

CORS 설정

- WebSocket 연결에 대한 CORS(Cross-Origin Resource Sharing) 설정을 할 수 있다

 

SocKJS 지원

- SockJS 폴백 옵션을 활성화하여 WebSocket을 지원하지 않는 브라우저에 대한 대체 솔루션을 제공할 수 있다.

 

기본 코드

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(new MyWebSocketHandler(), "/myHandler")
                .setAllowedOrigins("*")
                .withSockJS();
    }
}

 

💡[참고] WebSocketHandlerRegistry의 주요 메서드들

 

addHandler(WebSocketHandler handler, String... paths)

- WebSocket 핸들러를 지정된 URL 경로에 등록합니다.

 

setAllowedOrigins(String... origins)

- 허용된 오리진(도메인)을 설정합니다. CORS(Cross-Origin Resource Sharing) 정책을 관리하는 데 사용됩니다.

 

withSockJS()

- SockJS 폴백 옵션을 활성화합니다. WebSocket을 지원하지 않는 브라우저에 대한 대체 솔루션을 제공합니다.

 

setOrder(int order)

- 핸들러의 우선순위를 설정합니다. 낮은 값일수록 높은 우선순위를 가집니다.

 

addInterceptors(HandshakeInterceptor... interceptors)

- WebSocket 핸들셰이크 과정에 인터셉터를 추가합니다.

 

setHandshakeHandler(HandshakeHandler handshakeHandler)

- 사용자 정의 핸드셰이크 핸들러를 설정합니다.

 


2. TextWebSocketHandler

- Spring Framework에서 제공하는 WebSocket 핸들러 클래스로  '텍스트 기반의 WebSocket 메시지를 처리'하는 데 특화되어 있다.

 

🔖 주요 기능

텍스트 메시지 처리

- 문자열 형태의 WebSocket 메시지를 쉽게 처리할 수 있습니다.

 

추상 클래스

- TextWebSocketHandler는 추상 클래스로, 개발자가 필요한 메서드를 오버라이드하여 사용합니다.

 

WebSocketHandler 인테페이스 구

- WebSocketHandler인터페이스를 구현하여 WebSocket의 기본적인 생명주기 메서드를 제공합니다.

 

import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;

public class MyWebSocketHandler extends TextWebSocketHandler {

    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        String payload = message.getPayload();
        // 메시지 처리 로직
        session.sendMessage(new TextMessage("서버에서 보내는 응답: " + payload));
    }

    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        // 연결 설정 후 로직
    }

    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
        // 연결 종료 후 로직
    }
}

 

💡 [참고] TextWebSocketHandler와 같이 텍스트 처리외에 다른 웹 소켓 처리방식들

 

AbstractWebSocketHandler

- 빈 메서드로 구현된 WebSocketHandler의 편리한 기본 클래스입니다.

 

BinaryWebSocketHandler

- 바이너리 메시지만 처리하는WebSocketHandler구현을 위한 편리한 기본 클래스입니다.

 

PerConnectionWebSocketHandler

- 각 WebSocket 연결에 대해 WebSocketHandler인스턴스를 초기화하고 소멸시키며 다른 모든 메서드를 위임하는 WebSocketHandler입니다.

 

3. WebSocketMessageBrokerConfigurer 인터페이스

 

- Spring Framework에서 WebSocket 및 STOMP 메시징을 구성하는 데 사용되는 인터페이스입니다. 이 인터페이스를 구현하면 WebSocket 통신을 위한 다양한 설정을 할 수 있습니다.
- @EnableWebSocketMessageBroker 어노테이션을 통해서 WebSocket 메시징을 활성화하는 메서드입니다.
- 이를 사용하여 STOMP 프로토콜을 통한 WebSocket 메시지를 주고받을 수 있도록 메시징을 구성할 수 있습니다.

 

@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").withSockJS();
    }
}

 

💡 [참고] WebSocketMessageBrokerConfigurer 클래스의 주요 메서드

 

메서드 반환 타입 설명
addArgumentResolvers void 커스텀 컨트롤러 메서드 인자 타입을 지원하기 위한 리졸버를 추가합니다.
addReturnValueHandlers void 커스텀 컨트롤러 메서드 반환 값 타입을 지원하기 위한 핸들러를 추가합니다.
configureClientInboundChannel void WebSocket 클라이언트로부터 들어오는 메시지를 위한 MessageChannel을 구성합니다.
configureClientOutboundChannel void WebSocket 클라이언트로 나가는 메시지를 위한 MessageChannel을 구성합니다.
configureMessageBroker void 메시지 브로커 옵션을 구성합니다.
configureMessageConverters boolean 주석이 달린 메서드의 메시지 페이로드 추출 및 메시지 전송 시 사용할 메시지 변환기를 구성합니다.
configureWebSocketTransport void WebSocket 클라이언트로부터 받은 메시지와 클라이언트로 보내는 메시지 처리와 관련된 옵션을 구성합니다.
getPhase Integer SmartLifecycle 타입의 WebSocket 메시지 처리 빈이 실행되어야 하는 단계를 반환합니다.
registerStompEndpoints void 각각 특정 URL에 매핑되는 STOMP 엔드포인트를 등록하고, 선택적으로 SockJS 폴백 옵션을 활성화하고 구성합니다.

 

 

출처

 

이분보다 설명 잘해주신 분 없는 듯 합니다. 제꺼 보지말고 이분껄 보세

https://adjh54.tistory.com/573#4.%20%EA%B5%AC%EC%84%B1%ED%95%9C%20React%20%EC%95%B1%20%EB%82%B4%EC%97%90%EC%84%9C%20%EC%A7%81%EC%A0%91%20%EB%A9%94%EC%8B%9C%EC%A7%80%EB%A5%BC%20%EC%A0%84%EC%86%A1%ED%95%A9%EB%8B%88%EB%8B%A4.-1-19

 

[Java] Spring Boot WebSocket + STOMP 이해하고 구성하기 -1: 초기 구성 및 간단 소켓 연결

해당 글에서는 Spring Boot 기반 WebSocket에 대해 이해하고 초기 설정 이후 WebScocket에 연결하는 방법에 대해 알아봅니다  1) Spring Boot WebSocket💡 Spring Boot WebSocket- Spring Framework에서 제공하는 기능으로

adjh54.tistory.com