스프링 웹 소켓 알아보기(2)
웹 소켓이란 뭘까?
웹 소켓 프로토콜
- 웹 소켓 프로토콜은 단일 TCP연결을 통해 클라이언트와 서버가 full-duplex 즉, 전 이중 통신을 수행하는 방법이다.
- HTTP와는 다른 TCP 프로토콜이지만 80 및 443 포트를 사용하고 기존 방화벽 규칙을 재사용할 수 있도록 HTTP를 통해 작동하도록 설계되었다.
WebSocket상호작용은 HTTP 업그레이드 헤더를 사용하여 업그레이드하거나, WebSocket 프로토콜로 전환하는 HTTP 요청으로 시작한다.GET /spring-websocket-portfolio/portfolio HTTP/1.1 Host: localhost:8080 Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: Uc9l9TMkWGbHFD2qnFHltg== Sec-WebSocket-Protocol: v10.stomp, v11.stomp Sec-WebSocket-Version: 13 Origin: http://localhost:8080Upgrade헤더와 Connection은Upgrade를 사용해야함
이 경우 웹 소켓을 지원하는 서버는 확인했다는 신호로 2xx번대 상태코드가 아닌 101 Switching Protocols의 리턴이 온다.
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: 1qVdfYHU9hPOl4JYYNXF623Gzn0=
Sec-WebSocket-Protocol: v10.stomp
성공적인 핸드셰이크 후, HTTP 업그레이드 요청을 기반으로 하는 TCP 소켓은 클라이언트와 서버 모두가 메시지를 계속 보내고 받을 수 있도록 열려 있는다.
HTTP vs WebSocket
앞서 말했듯 WebSocket은 HTTP와 호환되도록 설계되었지만 두 프로토콜이 매우 다른 아키텍처와 애플리케이션 프로그래밍 모델을 가져온다는 점을 이해하는 것이 중요하다.
HTTP
- 보통의 REST는 여러 URL로 모델링되며, 애플리케이션과 상호 작용하기 위해 클라이언트는 request-response 스타일로 URL에 접근한다.
이후 서버는 HTTP URL, 메서드 및 헤더에 따라 적절한 핸들러로 요청을 라우팅한다.
WebSocket
- 그러나 WebSocket에서 일반적으로 초기 연결에 대한 URL하나만 존재한다. 그 후 모든 애플리케이션 메시지는 동일한 TCP 연결에서 흐른다.
- 또한 HTTP와 달리 메시지의 구조나 의미(semantics)에 대한 표준화된 규약이 없다.
- 따라서 WebSocket 클라이언트와 서버는 HTTP 핸드셰이크 과정에서
Sec-WebSocket-Protocol헤더를 통해 상위 레벨의 메시징 프로토콜을 협상해야한다.
STOMP??
STOMP는 메시지의 구조와 의미를 표준화하여 클라이언트와 서버 간의 통신을 간소화한다.
특징
- 메시징 프로토콜 표준화 : 클라이언트와 서버가 메시지의 의미와 형식을 쉽게 이해할 수 있도록 정의
- Pub/Sub 모델 지원 : 특정 topic에 대한 구독과 메시지 발송이 가능하며 이를 통해 채팅 애플리케이션, 실시간 알림 시스템 구현에 적합
- WebSocket과 통합: WebSocket 핸드셰이크 요청의 Sec-WebSocket-Protocol 헤더에서 v10.stomp, v11.stomp 등을 사용해 STOMP 협상 가능.
웹 소켓을 사용하는것이 더 유리할 경우
WebSocket을 사용할 필요가 없는 경우
- 주기적인 업데이트로 충분한 경우
뉴스 피드, 이메일 알림, 소셜 미디어 피드와 같은 애플리케이션은 실시간 업데이트가 필요하지만, 몇 분 간격으로 업데이트되는 것으로 충분할 수 있다. 이러한 경우 WebSocket은 오히려 과한 선택이 될 수 있다. - 메시지 빈도가 낮은 경우
네트워크 상태 모니터링처럼 메시지의 빈도가 낮거나 간헐적으로 발생하는 경우, HTTP 스트리밍이나 폴링 방식으로도 충분히 효율적으로 구현할 수 있다.
WebSocket이 적합한 경우
-
실시간 상호작용이 필요한 애플리케이션
협업 도구(문서 편집, 화상 회의), 온라인 게임, 금융 애플리케이션(주식 거래, 차트 갱신)과 같이 낮은 지연 시간(Latency)과 높은 응답성을 요구하는 경우에는 WebSocket이 훨씬 적합하다. -
낮은 지연 시간, 높은 빈도, 높은 메시지 볼륨의 조합
메시지가 자주 발생하고(고빈도), 데이터의 양이 많으며(고볼륨), 실시간 처리가 필요한 애플리케이션에서 WebSocket은 가장 적합한 선택이다.