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

| 구분 | 역할 | 예시 |
|---|---|---|
| SEND | 메시지를 특정 목적지로 전송 | /pub/chat.send |
| SUBSCRIBE | 메시지를 수신할 채널 구독 | /sub/chat/room/{id} |
| CONNECT | 서버와 STOMP 세션 연결 | /ws-stomp |
| DISCONNECT | 세션 종료 | 연결 종료 시 |
<aside> 💡
STOMP는 WebSocket 위에서 동작하는 메시징 프로토콜로, 텍스트 기반의 프레임 구조를 사용합니다.
</aside>
Spring에서는 내장 메시지 브로커를 설정하여, 클라이언트 간 메시지 교환을 중개할 수 있습니다.
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);
}
}