<aside> 📖

학습 목표


1. Spring Boot에서 WebSocket 구현 개요

Spring Boot에서는 Spring Messaging 모듈을 기반으로 WebSocket을 쉽게 구현할 수 있습니다. 단순히 양방향 통신을 제공하는 WebSocket 위에 STOMP 프로토콜을 적용하면, 메시징 구조를 명확하게 정의하고, 여러 클라이언트 간 통신을 효율적으로 중개할 수 있습니다.

📦 src/main/java/com/example/websocket
 ┣ 📂config
 ┃ ┗ 📜WebSocketConfig.java
 ┣ 📂controller
 ┃ ┗ 📜ChatController.java
 ┣ 📂dto
 ┃ ┗ 📜ChatMessage.java
 ┣ 📂interceptor
 ┃ ┗ 📜StompChannelInterceptor.java
 ┣ 📂service
 ┃ ┗ 📜ChatService.java

<aside> 💡

WebSocket만 사용하면 연결 관리와 메시지 라우팅을 직접 구현해야 하지만, STOMP를 사용하면 메시징 프레임워크가 이 과정을 자동화합니다.

</aside>


2. STOMP 프로토콜의 이해

2-1. STOMP란?

STOMP는 Simple Text Oriented Messaging Protocol의 약자로, 메시지 브로커를 통해 메시지를 교환하기 위한 텍스트 기반 프로토콜입니다. HTTP가 요청-응답 기반이라면, STOMP는 Publish-Subscribe(발행-구독) 모델을 따릅니다.

image.png

구분 역할 예시
SEND 메시지를 특정 목적지로 전송 /pub/chat.send
SUBSCRIBE 메시지를 수신할 채널 구독 /sub/chat/room/{id}
CONNECT 서버와 STOMP 세션 연결 /ws-stomp
DISCONNECT 세션 종료 연결 종료 시

<aside> 💡

STOMP는 WebSocket 위에서 동작하는 메시징 프로토콜로, 텍스트 기반의 프레임 구조를 사용합니다.

</aside>


3. 메시지 브로커 구성

Spring에서는 내장 메시지 브로커를 설정하여, 클라이언트 간 메시지 교환을 중개할 수 있습니다.

3-1. 설정 클래스 예제

implementation 'org.springframework.boot:spring-boot-starter-websocket'
@Configuration
@EnableWebSocketMessageBroker // STOMP 사용 활성화
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        // 클라이언트가 연결할 WebSocket 엔드포인트 정의
        registry.addEndpoint("/ws-stomp")
                .setAllowedOriginPatterns("*") // CORS 허용
                .withSockJS(); // SockJS fallback 지원
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        // 메시지 발행(Publish) 경로 prefix
        registry.setApplicationDestinationPrefixes("/pub");

        // 구독(Subscribe) 경로 prefix
        registry.enableSimpleBroker("/sub");
    }
    
    @Override
    public void configureClientInboundChannel(ChannelRegistration registry) {
        registry.interceptors(stompChannelInterceptor);
    }
}