멋쟁이 사자처럼

[멋사 백엔드 부트캠프] Websocekt이란

sunm2n 2025. 6. 24. 17:10

 

WebSocket은 클라이언트와 서버 간의 지속적인 연결을 유지하고 양방향 통신이 가능한 프로토콜이다.

*프로토콜 : 컴퓨터나 네트워크 장치 간의 통신 시 서로 주고 받는 데이터 형식과 규칙

요청-응답 모델을 사용하는 기존 HTTP와 달리 WebSocket새로운 연결을 반복적으로 설정하지 않고도

지속적으로 양방향 데이터 교환을 가능하게 한다.  (채팅 어플리케이션,온라인 게임, 주식 시세 등)

 

 

단! HTTP 요청을 아예 보내지 않는 것은 아니다!

 

 

webSocket도 연결을 하기 위해서는 최초에 한번은 HTTP 요청을 보낸다. 

 

 

Spring에서 WebSocket을 사용하는 대표적인 두가지

 

1.Spring WebSocket

 

특징 : 연결만 제공하고 핸들러를 직접 구현해야 함

 

예시 코드

 

session -> 연결 상태를 관리하는 객체

 

 

 

2.Spring WebSocket + STOMP

 

STOMP (Simple Text Oriented Messaging Protocol) ->텍스트 기반의 메시지 전송 프로토콜

 

특징 : 채팅방(채널) 구분, 구독/발행, 메시지 라우팅을 STOMP에서 자동 처리

 

-WebSocket 위에서 동작하는 메시징 프로토콜

-메시지를 어떻게 주고받을지의 규칙이 정해져 있음

 

예시 코드

 

 

 

 

STOMP를 많이 쓰는 이유

 

1.생산성과 유지보수성

  -채팅방, 알림, 구독/취소, 브로드캐스트 등의 기능을 다 내장하고 있음

 

2.코드가 간결하고 실수 가능성이 적음

  -세션 관리, 채팅방 관리, 사용자 매핑, 목적지 라우팅 등을 다 코드로 직접 구현하면

  버그도 많이 생기고, 개발자마다 방식이 다르고, 테스트/유지보수/협업 시 문제 생김

 

3.확장성/변경 용이

  -1:1 채팅방, 1:N 그룹방, 토픽별 알림 등을 STOMP경로만 바꾸면 적용 가능.

  -순수 WebSocket은 내부 코드 구조도 전부 변경 필요.

 

 

 

 

하지만 순수 WebSocket을 써야 하는 상황은?

 

1.초고성능/초경량 통신이 필요할 때

  -게임서버,초저지연 실시간 서비스

  -1ms 단위의 레이턴시가 중요한 상황

  -최대한 "가공"을 없애고 패킷 크기를 최소화하고 싶을 때

  -(STOMP는 텍스트 기반 프레임, 헤더 등 오버헤드가 조금이라도 있음)

 

2.메시지 구조를 직접 커스텀해야 할 때

  -사내 전용 메시지 포맷, 엔터프라이즈 표준, 바이너리 전용 등

 

3.아주 단순한 서비스

  -채널/구독/방 기능이 필요 없는 경우

  -간단한 테스트용 데모 서버 등

 

 

 

 

stomp 메시지 이동흐름