뭐든 즐기면서 ;)

Spring Boot WebSocket server 구현 기본(HandshakeInterceptor 사용) 본문

BACK/Spring Boot & JPA

Spring Boot WebSocket server 구현 기본(HandshakeInterceptor 사용)

Tada.*+ 2023. 7. 19. 23:50
728x90

WebSocket 개념에 대한 것은 무수히도 많은, 좋은 글들이 많기 때문에 생략하고, 실 구현에 필요한 코드만 쏘심플하게 작성했다.

 

1. dependencies 추가

dependencies {
    ...
    implementation 'org.springframework.boot:spring-boot-starter-websocket'
    ...
}

2. 소켓 구현

package ai.maum.bsbf.conf.websocket;

import ai.maum.bsbf.util.LogUtil;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.*;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(webSocketHandler(), "/ws") // websocket  uri
                .setAllowedOrigins("*"); // CORS 모든 url 허용 (실 개발 시에는 모든 url을 허용해서는 안 됨.)
    }

    @Bean
    public WebSocketHandler webSocketHandler() {
        return new WebSocketHandler() {
            private final Map<String, WebSocketSession> CLIENTS = new ConcurrentHashMap<>(); // 웹 소켓 연결 session 모음

            @Override
            public void afterConnectionEstablished(WebSocketSession session) throws Exception { // 웹 소켓 연결 시
                CLIENTS.put(session.getId(), session);
                LogUtil.info("웹 소켓 연결 : " + session.getId());

                session.sendMessage(new TextMessage("접속됨."));
            }

            @Override
            public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception { // 데이터 통신 시
                session.sendMessage(message);
            }

            @Override
            public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception { // 웹소켓 통신 오류 시
                LogUtil.debug("웹 소켓 통신 오류 : " + session.getId());
            }

            @Override
            public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception { // 웹소켓 연결 종료 시
                CLIENTS.remove(session.getId());
                LogUtil.info("웹 소켓 종료 : " + session.getId());
            }

            @Override
            public boolean supportsPartialMessages() {
                return false;
            }
        };
    }

}

3. 연결 테스트를 해본다.

Postman을 이용하여 WebSocket 통신 확인해 보기

728x90
Comments