이번엔 웹소켓에 대해서 처음부터 공부를 해보려고 한다. websocket이 뭘까 어떻게 연결되고 사용되는지 여기서 나오는 개념들이 뭔지 하나씩 파헤쳐 보자.
간략하게 전체적인 구성을 보고 한번 개념에 대해서 알아보자. spring boot에서 사용하는 웹소켓 아키텍처는 다음과 같다. 음 일단 흐름만 봤을 때는 보내는 방식이 2가지가 있고 내부에 simple broker라는 걸 통해서 메시지가 전달된다는 걸 확인할 수 있다.
웹소켓은 클라이언트와 서버간의 하나의 TCP 연결을 통해서 실시간으로 데이터를 주고받을 수 있게 하는 통신 프로토콜이다.
특징
프로토콜 스키마 -> 일반은 ws:// 보안 연결은 wss:// 스키마 사용
오버헤드가 적고 빠른 응답 시간을 요구하는 프로젝트들을 다 한번쯤을 고려해볼 만한 기술이다.
채팅, 알림, 데이터 시각화, 게임 등등
spring websocket을 저수준에서 관리하고 사용할 수 있는데 WebsocketHandler
라는 핸들러를 사용하면 된다.
이는 웹소켓 연결의 생명 주기(연결, 메시지 수신, 연결 종료 등) 이벤트를 직접 처리하고, 개별 메시지를 바이트 단위까지 제어하고 싶을 경우 사용된다.
WebSockerHandler
인터페이스를 구현하고 WebSocketConfigurer
를 통해서 이 핸들러를 등록하는 방식으로 구현하면 된다.
STOMP는 웹소켓 위에서 동작하는 메시징 프로토콜이다. 마치 구독 발행 모델처럼 메시지를 보내거나 구독하는 방식으로 동작한다.
@EnableWebSocketMessageBroker
어노테이션과 @MessageMapping
, @SendTo
같은 어노테이션으로 간단하게 구현할 수 있다.
보통의 경우 STOMP를 활용한 고수준의 메시징 방식이 더 개발 생산성이 높다. 이해가 필요하지만..
모든 웹 브라우저나 네트워크 환경이 웹소켓을 지원하지 않을 수 있다. 그런 경우 SockJS라는 라이브러리를 제공한다. 이를 가지고 처음에 websocket 연결을 우선 시도하고 실패할 경우 HTTP 스트리밍이나 롱 폴링 같은 기술을 사용하여 최대한 유사하게 경험을 제공해 줄 수 있다.
이렇게 간단하게 처음에는 기본 개념에 대해서 알아보게 되었는데 간단하게 전체적으로 어떻게 동작하는지에 대해서 느낌이 왔다면 성공이다. 처음부터 깊에 알 순 없다. 처음엔 간단하게 이해하고 그 뒤로 가면서 더 깊이있는 내용을 공부하는게 효율이 좋은 것 같다.