1. WebSocket이란 무엇인가?
웹 애플리케이션이 사용자와 실시간으로 데이터를 주고받아야 할 때 WebSocket은 가장 적합한 통신 프로토콜 중 하나입니다. WebSocket은 HTML5 표준 중 하나로, 서버와 클라이언트 간의 양방향 통신을 지원하며 HTTP보다 효율적으로 데이터를 주고받을 수 있습니다.
- HTTP와의 차이점
HTTP는 클라이언트가 요청(Request)을 보내고 서버가 응답(Response)을 반환하는 방식으로 작동하지만, WebSocket은 한 번 연결이 이루어지면 지속적으로 양방향 통신이 가능합니다.
이를 통해, 클라이언트가 요청하지 않아도 서버가 데이터를 푸시(Push)할 수 있습니다.
2. WebSocket의 동작 원리
WebSocket은 다음과 같은 과정을 거쳐 동작합니다.
- 핸드셰이크(Handshake) 과정
클라이언트는 HTTP 프로토콜을 사용해 서버에 WebSocket 연결 요청을 보냅니다.
서버는 요청을 수락하면 HTTP 상태 코드 101(Switching Protocols)을 반환하며 WebSocket 연결이 성립됩니다. - 양방향 통신
연결 후 클라이언트와 서버는 별도의 요청 없이 데이터를 주고받을 수 있습니다. 이는 TCP 소켓 기반으로 동작하므로 지속적인 연결을 유지합니다. - 연결 종료
클라이언트나 서버 중 하나가 연결 종료를 요청하면, 연결이 닫히고 리소스가 해제됩니다.
3. WebSocket의 장점
- 실시간 데이터 전송
서버와 클라이언트가 즉각적으로 데이터를 주고받아야 하는 환경(채팅, 주식 시세 등)에 적합합니다. - 네트워크 효율성
연결이 유지되는 동안에는 추가적인 HTTP 헤더가 필요하지 않아 데이터 전송이 더 효율적입니다. - 양방향 통신
클라이언트와 서버 모두 데이터를 보낼 수 있어 유연한 애플리케이션 설계가 가능합니다.
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 사용 시 주의 사항
- 보안
WebSocket은 ws://와 wss://(보안 WebSocket)를 지원합니다. 민감한 데이터 전송 시 반드시 SSL을 통해 암호화된 wss://를 사용해야 합니다. - 연결 관리
클라이언트 또는 서버의 비정상적인 종료로 인해 연결이 끊기는 상황을 대비해 재연결 로직을 구현해야 합니다. - 스케일링
많은 클라이언트가 연결될 경우 서버의 리소스를 효율적으로 관리하기 위한 스케일링 전략이 필요합니다. 예를 들어, WebSocket 서버를 확장하려면 Redis Pub/Sub와 같은 메시지 브로커를 활용할 수 있습니다.
6. 마무리
WebSocket은 실시간 데이터 전송이 필요한 다양한 애플리케이션에서 핵심적인 역할을 합니다. 채팅, 주식 거래, 게임 등 다양한 분야에서 WebSocket을 활용하면 네트워크 효율성과 사용자 경험을 크게 향상할 수 있습니다.
Spring Boot를 사용하면 WebSocket 서버를 쉽게 구성할 수 있으므로, 위 예제와 같이 애플리케이션 요구사항에 맞는 WebSocket 구현을 시도해 보세요.
'스프링 부트3' 카테고리의 다른 글
스프링 부트 3에서 Docker로 배포하기 (0) | 2024.12.05 |
---|---|
MockMVC로 스프링 부트 3 컨트롤러 테스트 (0) | 2024.12.05 |
Spring Data JPA를 사용한 기본 데이터 쿼리 (0) | 2024.12.05 |
스프링 부트 3와 JSON 데이터 처리 (0) | 2024.12.05 |
Thymeleaf를 이용한 스프링 부트 3 템플릿 엔진 (0) | 2024.12.05 |