오늘은 멋쟁이사자처럼에서 WebSocket에 대해 공부했습니다.
WebSocket은 기존 HTTP 기반의 요청-응답 방식과 달리 양방향, 실시간 통신이 가능한 프로토콜이다.
이를 활용하면 실시간 채팅, 주식 거래, 라이브 스트리밍 등의 기능을 구현할 수 있다.
1) 핸드셰이크(Handshake) → HTTP 요청을 통해 WebSocket 연결을 설정 (Upgrade: websocket)
2) 양방향 통신(Full-Duplex) → 클라이언트와 서버가 독립적으로 메시지를 주고받을 수 있음
3) 프레임 단위 통신 → WebSocket은 텍스트 또는 바이너리프레임으로 데이터를 송수신
4) Ping/Pong 프레임 → 연결 상태를 유지하기 위해 주기적으로 확인
5) 연결 종료(Close Frame) → 클라이언트 또는 서버가 종료 요청을 보내고 연결을 닫음
| 비교 항목 | WebSocket | HTTP |
|---|---|---|
| 통신 방식 | 양방향 (Full-Duplex) | 단방향 (Request-Response) |
| 연결 유지 | 지속적인 연결 유지 | 요청마다 새로운 연결 |
| 데이터 교환 | 실시간 전송 | 요청 시에만 응답 |
| 사용 사례 | 채팅, 주식 데이터, IoT 등 | 일반적인 웹 서비스 |
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(new ChatWebSocketHandler(), "/ws").setAllowedOrigins("*");
}
}
/ws 엔드포인트로 WebSocket 핸들러 등록 setAllowedOrigins("*") → CORS 문제 해결 @Component
public class ChatWebSocketHandler extends TextWebSocketHandler {
private final Set<WebSocketSession> sessions = new CopyOnWriteArraySet<>();
@Override
public void afterConnectionEstablished(WebSocketSession session) {
sessions.add(session);
}
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) {
for (WebSocketSession webSocketSession : sessions) {
if (webSocketSession.isOpen()) {
webSocketSession.sendMessage(message);
}
}
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) {
sessions.remove(session);
}
}
장점
단점
WebSocket은 실시간 데이터 처리가 필요한 서비스에서 필수적인 기술이다.
하지만서버 부하 관리 및 세션 처리가 중요하므로 적절한 인증 및 부하 분산 전략을 함께 고려해야 한다는 점을 배웠다.