[study] spring과 웹소켓
웹소켓 언제쓰지?
사용자들끼리 실시간으로 정보를 공유해야 할 때 사용됩니다. 전이중 통신을 이용해서 실시간성을 보장합니다.
게임, 채팅, 실시간 주식 거래 사이트 등등에서 사용됩니다.
웹소켓 vs HTTP
HTTP에서도 실시간성을 보장할 수 있을까? HTTP에서도 실시간성을 보장하는 기법이 존재합니다. Polling, Long Polling, Streaming이 있습니다. 그럼에도 웹소켓이 사용한 환경이라면, HTTP를 이용한 기술보다도 웹소켓을 사용합니다.
HTTP와 웹소켓의 가장 큰 차이점은 수립된 연결을 어떻게 하느냐 입니다. HTTP는 비 연결성 프로토콜입니다. 클라이언트가 요청을 보낼때마다 응답을 받고 연결을 끊어버립니다. 웹소켓의 경우에는 한번 연결을 맺은 뒤 유지됩니다. 한 쪽이 연결을 끊으라는 요청을 보내기 전까지는 그 연결을 유지합니다. 이렇게 함으로써 얻을 수 있는 이점은 연결때 마다 발생하는 비용을 줄일 수 있습니다. HTTP로 연결할 때마다 4-handshake, 3-handshake 과정을 거치는데, 웹소켓은 그런 과정을 거칠 필요가 없습니다.
또 하나의 차이점은 통신을 하는 방식입니다. HTTP는 요청과 응답이 한 쌍을 이루는 구조로 이루어져 있습니다. 내가 원하는 응답을 얻기 위해서는 항상 서버에 먼저 요청을 보내야 합니다. 반면 웹소켓은 연결이 유지되고 있는 상태이기 때문에 연결된 채널을 통해서 상대방이 보내는 메시지를 듣고 있기만 하면 됩니다.
그리고 HTTP와 웹소켓은 보내는 메시지 양에서도 차이가 있습니다. HTTP를 이용하게 되면, 필요 이상의 데이터를 서버로 보내고 다시 받게 됩니다. 실시간성으로 요청과 응답이 필요한 경우에는 부담이 될 수 있습니다. 웹소켓은 한번 연결이 수락되고 나면 간단한 메시지만 주고 받을 수 있습니다. HTTP대신 웹소켓을 이용하면 통신에 필요한 비용을 줄일 수 있습니다.
웹소켓 in Spring
웹소켓 핸들러는 기본적으로 바이너리와 텍스트를 지원합니다. 웹소켓 세션을 이용하는데, HTTP에서 사용하는 세션과는 다릅니다. 웹소켓 세션은 웹소켓이 연결될 때 연결 정보를 갖고 있는 객체입니다. 핸들러에서 웹소켓 통신을 처리하기 위해 세션들을 컬렉션으로 관리합니다. 연결될 때 세션을 추가하고 연결을 끊는다면 세션을 제거합니다. 세션들을 관리하면 모든 클라이언트에게 메시지를 보낸 것 같은 처리를 할 수 있습니다.