✨ 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 폴백 옵션을 활성화하고 구성합니다. |
출처
이분보다 설명 잘해주신 분 없는 듯 합니다. 제꺼 보지말고 이분껄 보세
[Java] Spring Boot WebSocket + STOMP 이해하고 구성하기 -1: 초기 구성 및 간단 소켓 연결
해당 글에서는 Spring Boot 기반 WebSocket에 대해 이해하고 초기 설정 이후 WebScocket에 연결하는 방법에 대해 알아봅니다 1) Spring Boot WebSocket💡 Spring Boot WebSocket- Spring Framework에서 제공하는 기능으로
adjh54.tistory.com
'Spring' 카테고리의 다른 글
[Spring] Apache Kafka 이해하기 (0) | 2025.04.01 |
---|---|
[Spring] Spring Boot WebSocket + STOMP 사용해서 단체 채팅 구현하기 (0) | 2025.03.31 |