Spring에서는 WebSocket을 아래와 같이 관리
Raw WebSocket
메시지 라우팅, 세션 관리, 메시지 형식 등을 개발자가 직접 처리
예제 코드
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
private final ChatWebSocketHandler chatWebSocketHandler;
public WebSocketConfig(ChatWebSocketHandler chatWebSocketHandler) {
this.chatWebSocketHandler = chatWebSocketHandler;
}
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(chatWebSocketHandler, "/ws/chat")
.setAllowedOrigins("*");
}
}실제 WebSocket 메세지를 처리하는 Handler를 직접 구현
@Component
public class ChatWebSocketHandler extends TextWebSocketHandler {
@Override
public void afterConnectionEstablished(WebSocketSession session) {
System.out.println("WebSocket 연결: " + session.getId());
}
@Override
protected void handleTextMessage(
WebSocketSession session,
TextMessage message
) throws Exception {
System.out.println("수신 메시지: " + message.getPayload());
session.sendMessage(
new TextMessage("서버 응답: " + message.getPayload())
);
}
@Override
public void afterConnectionClosed(
WebSocketSession session,
CloseStatus status
) {
System.out.println("WebSocket 연결 종료: " + session.getId());
}
}Spring Messaging
- 하위 프로토콜 혹은 컨벤션을 정의할 필요가 없음
- 연결 주소마다 새로 핸들러를 구현하고 설정해줄 필요가 없음
- 외부 Messaging Queue를 사용 가능
- Spring Security를 사용 가능
Spring이 STOMP를 사용하는 흐름은 다음과 같다.

예제 코드
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
// WebSocket 연결을 맺는 Endpoint
registry.addEndpoint("/ws");
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
// 클라이언트가 서버의 @MessageMapping으로 메시지를 보낼 때 사용하는 prefix
registry.setApplicationDestinationPrefixes("/app");
// 클라이언트가 메시지를 구독할 때 사용하는 prefix
registry.enableSimpleBroker("/topic");
}
}@Controller
public class ChatController {
@MessageMapping("/chat")
@SendTo("/topic/chat")
public ChatMessage send(ChatMessage message) {
return message;
}
}