본문 바로가기
스프링 부트3

WebSocket을 사용한 실시간 통신

by 굿센스굿 2024. 12. 5.
반응형

 


1. WebSocket이란 무엇인가?

웹 애플리케이션이 사용자와 실시간으로 데이터를 주고받아야 할 때 WebSocket은 가장 적합한 통신 프로토콜 중 하나입니다. WebSocket은 HTML5 표준 중 하나로, 서버와 클라이언트 간의 양방향 통신을 지원하며 HTTP보다 효율적으로 데이터를 주고받을 수 있습니다.

  • HTTP와의 차이점
    HTTP는 클라이언트가 요청(Request)을 보내고 서버가 응답(Response)을 반환하는 방식으로 작동하지만, WebSocket은 한 번 연결이 이루어지면 지속적으로 양방향 통신이 가능합니다.
    이를 통해, 클라이언트가 요청하지 않아도 서버가 데이터를 푸시(Push)할 수 있습니다.

2. WebSocket의 동작 원리

WebSocket은 다음과 같은 과정을 거쳐 동작합니다.

  1. 핸드셰이크(Handshake) 과정
    클라이언트는 HTTP 프로토콜을 사용해 서버에 WebSocket 연결 요청을 보냅니다.
    서버는 요청을 수락하면 HTTP 상태 코드 101(Switching Protocols)을 반환하며 WebSocket 연결이 성립됩니다.
  2. 양방향 통신
    연결 후 클라이언트와 서버는 별도의 요청 없이 데이터를 주고받을 수 있습니다. 이는 TCP 소켓 기반으로 동작하므로 지속적인 연결을 유지합니다.
  3. 연결 종료
    클라이언트나 서버 중 하나가 연결 종료를 요청하면, 연결이 닫히고 리소스가 해제됩니다.

3. WebSocket의 장점

  1. 실시간 데이터 전송
    서버와 클라이언트가 즉각적으로 데이터를 주고받아야 하는 환경(채팅, 주식 시세 등)에 적합합니다.
  2. 네트워크 효율성
    연결이 유지되는 동안에는 추가적인 HTTP 헤더가 필요하지 않아 데이터 전송이 더 효율적입니다.
  3. 양방향 통신
    클라이언트와 서버 모두 데이터를 보낼 수 있어 유연한 애플리케이션 설계가 가능합니다.

4. WebSocket을 사용한 예시

예시 1: 실시간 채팅 애플리케이션

사용자가 채팅방에 접속하면 WebSocket 연결이 이루어지고, 모든 채팅 메시지가 실시간으로 전송됩니다. 다음은 Spring Boot에서 구현 예제입니다.

서버 측 코드

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(new ChatWebSocketHandler(), "/chat").setAllowedOrigins("*");
    }
}

핸들러 코드

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

public class ChatWebSocketHandler extends TextWebSocketHandler {

    @Override
    public void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        // 받은 메시지를 클라이언트로 다시 전송
        session.sendMessage(new TextMessage("Echo: " + message.getPayload()));
    }
}

예시 2: 실시간 주식 가격 업데이트

주식 거래 시스템에서는 주식 가격 변동을 실시간으로 사용자에게 알리는 기능이 필요합니다. WebSocket을 사용하면 초당 여러 업데이트도 문제없이 처리할 수 있습니다.

서버 측 구현

import org.springframework.stereotype.Component;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;

import java.util.ArrayList;
import java.util.List;

@Component
public class StockPriceHandler extends TextWebSocketHandler {

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

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

    public void sendStockPriceUpdate(String stockUpdate) {
        for (WebSocketSession session : sessions) {
            try {
                session.sendMessage(new TextMessage(stockUpdate));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

예시 3: 온라인 게임의 실시간 위치 업데이트

멀티플레이어 온라인 게임에서 WebSocket을 사용하면 플레이어의 위치 정보와 상태를 실시간으로 동기화할 수 있습니다. 서버는 각 플레이어의 정보를 클라이언트에 전송하고, 클라이언트는 자신의 상태를 서버에 전달합니다.


5. WebSocket 사용 시 주의 사항

  1. 보안
    WebSocket은 ws://와 wss://(보안 WebSocket)를 지원합니다. 민감한 데이터 전송 시 반드시 SSL을 통해 암호화된 wss://를 사용해야 합니다.
  2. 연결 관리
    클라이언트 또는 서버의 비정상적인 종료로 인해 연결이 끊기는 상황을 대비해 재연결 로직을 구현해야 합니다.
  3. 스케일링
    많은 클라이언트가 연결될 경우 서버의 리소스를 효율적으로 관리하기 위한 스케일링 전략이 필요합니다. 예를 들어, WebSocket 서버를 확장하려면 Redis Pub/Sub와 같은 메시지 브로커를 활용할 수 있습니다.

6. 마무리

WebSocket은 실시간 데이터 전송이 필요한 다양한 애플리케이션에서 핵심적인 역할을 합니다. 채팅, 주식 거래, 게임 등 다양한 분야에서 WebSocket을 활용하면 네트워크 효율성과 사용자 경험을 크게 향상할 수 있습니다.
Spring Boot를 사용하면 WebSocket 서버를 쉽게 구성할 수 있으므로, 위 예제와 같이 애플리케이션 요구사항에 맞는 WebSocket 구현을 시도해 보세요.

반응형