본문 바로가기

Study Information Technology

Spring Boot와 WebSocket 실시간 웹 애플리케이션 구현하기

728x90
반응형

Spring Boot와 WebSocket: 실시간 웹 애플리케이션 구현하기

Overview

Spring Boot와 WebSocket을 활용하면 실시간으로 데이터를 주고받는 웹 애플리케이션을 쉽게 구축할 수 있습니다. WebSocket은 클라이언트와 서버 간의 지속적인 연결을 제공하며, 이를 통해 실시간 채팅, 실시간 데이터 업데이트 등 다양한 기능을 구현할 수 있습니다. 이번 글에서는 Spring Boot와 WebSocket을 이용해 간단한 실시간 채팅 애플리케이션을 구축하는 방법을 자세히 설명하겠습니다.

1. WebSocket 이해하기

WebSocket은 HTTP 프로토콜을 기반으로 한 양방향 통신 프로토콜입니다. HTTP는 클라이언트가 요청을 보내면 서버가 응답을 주는 단방향 통신 방식이지만, WebSocket은 클라이언트와 서버 간에 지속적인 연결을 유지하면서 양방향으로 데이터를 주고받을 수 있습니다.

주요 특징

  • 지속적인 연결: 초기 핸드쉐이크 후 클라이언트와 서버 간의 연결이 유지됩니다.
  • 낮은 레이턴시: 서버가 클라이언트에게 실시간으로 메시지를 푸시할 수 있습니다.
  • 양방향 통신: 클라이언트와 서버가 서로 메시지를 주고받을 수 있습니다.

2. Spring Boot에서 WebSocket 설정하기

Spring Boot에서 WebSocket을 사용하려면 몇 가지 설정이 필요합니다. 아래는 기본적인 설정 방법과 예제입니다.

2.1. 의존성 추가

Spring Boot 프로젝트에 WebSocket을 사용하기 위해 spring-boot-starter-websocket 의존성을 추가해야 합니다. pom.xml 파일에 아래와 같이 추가합니다.

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

2.2. WebSocket Config 클래스 작성

WebSocket을 사용하려면 @Configuration 어노테이션을 사용하여 WebSocket 설정을 정의하는 클래스를 작성해야 합니다. 이 클래스에서 WebSocketConfigurer 인터페이스를 구현하고 registerWebSocketHandlers 메서드를 오버라이드합니다.

import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

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

public MyHandler myHandler() {
return new MyHandler();
}
}

여기서 /chat 엔드포인트는 클라이언트가 연결할 URL 경로입니다. MyHandler는 WebSocket 핸들러를 구현한 클래스입니다.

2.3. WebSocket 핸들러 작성

WebSocketHandler 인터페이스를 구현하여 클라이언트와의 메시지 처리를 정의하는 클래스를 작성합니다.

import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketMessage;

public class MyHandler extends TextWebSocketHandler {

@Override
public void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
// 클라이언트로부터 받은 메시지를 처리하고, 클라이언트로 다시 보냅니다.
session.sendMessage(new TextMessage("Received: " + message.getPayload()));
}
}

이 핸들러는 클라이언트로부터 수신한 메시지를 다시 클라이언트로 전송합니다.

2.4. 클라이언트 측 구현

클라이언트 측에서는 WebSocket API를 사용하여 서버와 연결합니다. JavaScript를 사용하여 클라이언트 측 코드를 작성합니다.

<!DOCTYPE html>
<html>
  <head>
    <title>WebSocket Chat</title>
  </head>
  <body>
    <textarea id="messages" rows="10" cols="30"></textarea><br/>
    <input id="messageInput" type="text" />
    <button onclick="sendMessage()">Send</button>

    <script>
      var ws = new WebSocket("ws://localhost:8080/chat");

      ws.onmessage = function(event) {
        var messages = document.getElementById('messages');
        messages.value += event.data + '\n';
      };

      function sendMessage() {
        var input = document.getElementById('messageInput');
        ws.send(input.value);
        input.value = '';
      }
    </script>
  </body>
</html>

이 HTML 파일은 서버와 WebSocket 연결을 설정하고, 메시지를 보내고 받을 수 있는 기본적인 채팅 UI를 제공합니다.

3. 에러 처리 및 문제 해결

3.1. 연결 오류

  • 에러 코드: WebSocket connection to 'ws://localhost:8080/chat' failed
  • 원인: 서버가 실행되고 있지 않거나 WebSocket 엔드포인트가 잘못 설정되었을 수 있습니다.
  • 해결 방법: 서버가 실행되고 있는지 확인하고, WebSocketConfig에서 설정한 URL 경로와 클라이언트 측 URL이 일치하는지 확인합니다.

3.2. 메시지 전송 실패

  • 에러 코드: Failed to send message
  • 원인: 메시지 형식이 올바르지 않거나 서버 측에서 처리되지 않을 수 있습니다.
  • 해결 방법: MyHandler 클래스에서 handleTextMessage 메서드가 제대로 구현되어 있는지 확인하고, 클라이언트 측에서 올바른 형식으로 메시지를 전송하는지 검토합니다.

참고문서

위 링크들은 WebSocket과 Spring Boot을 활용한 실시간 웹 애플리케이션 구축에 대한 자세한 정보를 제공합니다. 이를 통해 더 깊이 있는 이해와 다양한 기능 구현을 시도해 보실 수 있습니다.

728x90
반응형