웹소켓 & 스프링
우아한 Tech의 "아론의 웹소켓&스프링"을 들으면서 정리한 내용입니다.
#웹소켓이란
전이중 통신을 보장해서 실시간성을 보장함
#HTTP
HTTP에서도 실시간성을 보장하는 기법이 존재함
웹소켓이 사용가능한 환경이면 HTTP보다 웹소켓을 이용하는 것을 추천함
#HTTP VS 웹소켓
HTTP : 비연결성, 매번 연결 맺고 끊는 과정의 비용이 발생, (요청 - 응답) 구조
ex) 탁구
웹소켓 : 연결 지향, 한번 연결 맺은 뒤 유지함, 양방향 통신
ex) 채팅
#웹소켓 지원 환경
IE, 사파리, 파이어폭스의 구버전에서는 사용 불가
웹 소켓을 지원하지 않는 환경에서는 SockJs, Socket.io를 통해 웹소켓을 사용하는거 같은 기능을 제공함
웹소켓을 지원하지 않는 버전이면 Streaming, Streaming도 안되면 Polling을 사용하여 지원함
#Spring-WebSocket
WebSocketConfig 클래스에 @EnableWebSocket 어노테이션과 WebSocketConfigurer을 implements하고, 함수를 만들어 주면 된다.
ex)
SocketTextHandler() : 직접 구현한 웹소켓 핸들러
/user : 웹소켓 연결 주소
WebSocketHandler
ex)
필요에 따라 extWebSocketHandler or BinaryWebSocketHandler를 사용하여 extends를 해줄 수 있음.
WebSocketSession은 http세션과는 다름, 웹소켓이 연결될때 생기는 연결정보를 담고 있는 객체
연결이 될 때 웹소켓 세션을 추가하고 연결이 끊어질 때 제거
cors에서 .withSockJS()를 추가하여 사용할 수 있음
#STOMP
Simple Text Oriented Messaging Protocol
메시지 브로커를 활용하여 쉽게 메시지를 주고 받을 수 있는 프로토콜
웹소켓 위에 얹어 함께 사용할 수 있는 하위 프로토콜
프레임 단위의 프로토콜 : 커맨드, 헤더, 바디
발신자가 수신자에게 바로 보내고자 하는 내용을 보내는게 가능하지만, 특정 가공을 거쳐 브로커를 통해 내용을 보내는것도 가능하다.
#Spring - WebSocketMessageBorker
기존 WebSocket의 소스에 특정 부분만 추가해주면됨
enableSimpleBroker() : 내장 브로커 사용, prefix(queue(1 :1), topic(1 : M))가 붙은 메시지를 발행 시 브로커가 처리
setApplicationDestinationPrefixes() : 메시지 핸들러로 라우팅 되는 Prefix
컨트롤러에 어노테이션을 추가하는것만으로 사용이 가능하다.
MessageMapping을 할 경우 /app의 핸들러를 거치게 됨
SendTo : 핸들러에서 처리를 마친 후 반환 값을 해당 주소의 경로로 메시지를 보냄
또한 웹소켓과는 다르게 Handler를 설정해줄 필요가 없음
addEndpoint() : 웹소켓 연결 주소, 이전처럼 Handler 하나하나 추가할 필요 없음
#STOMP를 Spring에서 사용하는 장점
하위 프로토콜 혹은 컨벤션을 정의할 필요가 없다.
연결 주소마다 새로 핸들러를 구현하고 설정해줄 필요가 없다
외부 Messaging Queue를 사용할 수 있다
Spring Security를 사용할 수 있다.