[java] Spring Framework를 사용하여 웹 소켓 채팅 서버 구축하기

본 포스트에서는 Spring Framework를 사용하여 웹 소켓 채팅 서버를 구축하는 방법을 알아보겠습니다.

1. Spring 프로젝트 설정

먼저, Spring 프로젝트를 설정해야 합니다. 다음과 같은 의존성을 가지는 Maven 프로젝트를 생성합니다.

<dependencies>
    <!-- Spring Boot Starter Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- Spring Boot Starter WebSocket -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-websocket</artifactId>
    </dependency>
</dependencies>

2. WebSocketConfiguration 클래스 생성

WebSocketConfiguration 클래스를 생성하여 웹 소켓 설정을 정의합니다. 이 클래스는 @Configuration 어노테이션을 추가하여 Spring의 설정 클래스임을 명시합니다.

@Configuration
@EnableWebSocket
public class WebSocketConfiguration implements WebSocketConfigurer {

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(chatWebSocketHandler(), "/chat").setAllowedOrigins("*");
    }

    @Bean
    public WebSocketHandler chatWebSocketHandler() {
        return new ChatWebSocketHandler();
    }
}

위의 예제에서는 /chat 엔드포인트에 웹 소켓 핸들러를 등록하고, 모든 오리진에 대해 허용하도록 설정합니다. ChatWebSocketHandler 클래스는 실제로 웹 소켓 요청을 처리하는 핸들러입니다.

3. WebSocketHandler 구현

WebSocketHandler를 구현하기 위해 TextWebSocketHandler 클래스를 상속받는 ChatWebSocketHandler 클래스를 생성합니다.

public class ChatWebSocketHandler extends TextWebSocketHandler {

    private final List<WebSocketSession> sessions = new CopyOnWriteArrayList<>();

    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        sessions.add(session);
    }

    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        for (WebSocketSession sess : sessions) {
            sess.sendMessage(message);
        }
    }

    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
        sessions.remove(session);
    }
}

위의 예제에서는 연결이 성립된 후에 웹 소켓 세션을 저장하고, 수신한 메시지를 접속한 모든 클라이언트에게 다시 전송합니다. 연결이 종료되면 세션은 제거됩니다.

4. Spring Boot 실행

이제 Spring Boot를 실행하여 웹 소켓 채팅 서버를 구동할 수 있습니다. Spring Boot 애플리케이션의 메인 클래스를 생성하고, @SpringBootApplication 어노테이션을 추가합니다.

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

5. 웹 소켓 테스트

웹 소켓 채팅 서버가 정상적으로 구동되었는지 확인하기 위해 클라이언트 측에서 테스트를 수행해볼 수 있습니다.

let socket = new WebSocket("ws://localhost:8080/chat");

socket.onopen = function(event) {
    console.log("WebSocket 연결 성공");
};

socket.onmessage = function(event) {
    console.log("받은 메시지: " + event.data);
};

socket.onclose = function(event) {
    console.log("WebSocket 연결 종료");
};

// 메시지 전송
socket.send("Hello, WebSocket!");

위의 예제에서는 ws://localhost:8080/chat에 접속하여 웹 소켓 통신을 수행합니다. 연결이 성공하면 “WebSocket 연결 성공”이 출력되고, 받은 메시지는 “받은 메시지: [메시지 내용]” 형식으로 출력됩니다. 연결이 종료되면 “WebSocket 연결 종료”가 출력됩니다.

이제 해당 클라이언트 코드를 실행하여 웹 소켓 채팅 서버가 잘 동작하는지 확인할 수 있습니다.

이상으로 Spring Framework를 사용하여 웹 소켓 채팅 서버를 구축하는 방법을 알아보았습니다. 자세한 내용은 공식 문서를 참고하시기 바랍니다.