1. WebSocketConfig.java
- 중요한 내용은 주석에 달려있음
- @EnableWebSocketMessageBroker
- websocket의 구현체를 사용할 경우 (대표적으로 stomp) 설정파일에 붙여줌
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
// socketJs 클라이언트가 WebSocket 핸드셰이크를 하기 위해 연결할 endpoint를 지정할 수 있다.
registry.addEndpoint("/chat/inbox")
.setAllowedOriginPatterns("*") // cors 허용을 위해 꼭 설정해주어야 함. setCredential() 설정시에 AllowedOrigin 과 같이 사용될 경우 오류가 날 수 있으므로 OriginPatterns 설정으로 사용하였음
.addInterceptors(new StompHandshakeInterceptor()) // 핸드쉐이크시 인터셉터를 넣을 수 있음
.withSockJS()
.setDisconnectDelay(30 * 1000)
.setClientLibraryUrl("https://cdnjs.cloudflare.com/ajax/libs/sockjs-client/1.5.1/sockjs.min.js"); // 프론트에서 사용하는 sockjs 라이브러리와 동일하게 사용하였음
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
// 클라이언트로부터 메시지를 받을 api의 prefix를 설정함
// publish
registry.setApplicationDestinationPrefixes("/pub");
// 메모리 기반 메시지 브로커가 해당 api를 구독하고 있는 클라이언트에게 메시지를 전달함
// to subscriber
registry.enableSimpleBroker("/sub");
}
}
2. StompHandshakeInterceptor.java
- HandshakeInterceptor를 구현하여 사용함
- 추가적으로 사용되며 handskake의 after, before 정보를 가로챌 수 있다
- beforeHandshake() 함수는 무조건 retrun 값을 true로 해야 handshake가 이루어진다.
(처음 오버라이딩 된 디폴트 값이 false여서 바꾸어 주지 않다가 10시간을 날렸다ㅠㅠ)
@Slf4j
@Component
public class StompHandshakeInterceptor implements HandshakeInterceptor {
@Override
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {
log.info("stomp handshake start");
return true;
}
@Override
public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) {
log.info("stomp hadnshake success!");
}
}
3. StompEventListener.java
- websocket이 연결되고 끊어질 때 이벤트 리스너를 달아 로그로 찍을 수 있다
@Component
@Slf4j
public class StompEventListener {
@EventListener
public void handleWebSocketConnectListener(SessionConnectedEvent event) {
StompHeaderAccessor headerAccessor = StompHeaderAccessor.wrap(event.getMessage());
String sessionId = headerAccessor.getSessionId();
log.info("[Connected] websocket session id : {}", sessionId);
}
@EventListener
public void handleWebSocketDisconnectListener(SessionDisconnectEvent event) {
StompHeaderAccessor headerAccessor = StompHeaderAccessor.wrap(event.getMessage());
String sessionId = headerAccessor.getSessionId();
log.info("[Disconnected] websocket session id : {}", sessionId);
}
}
'Spring > Spring Stomp' 카테고리의 다른 글
[Stomp] Spring Boot with React 채팅 서버 : 3-1. Stomp 정리 및 설명 (0) | 2022.03.02 |
---|---|
[Stomp] Spring Boot with React 채팅 서버 : 2. ChatRoomController (0) | 2022.03.02 |
[Stomp] Spring Boot with React 채팅 서버 : 1. Entity 디자인 (0) | 2022.03.02 |