본문 바로가기

Spring

WebSocket 기본

웹소켓이란?

 - 두 프로그램 사이에서 메세지( 텍스트와 바이너리 ) 를 주고 받기 위한 통신 방법중 하나

 

특징

 - 양방향 통신이다. 데이터 송수신을 동시에 처리할 수 있다.

 - 클라이언트와 서버가 각각 서로 원할 때 송신을 할 수 있다.

     tip ) HTTP 통신은 클라이언트가 요청을 보낼 때만 서버가 응답해주는 단방향 통신이었다.

 - 실시간 네트워킹 : 웹환경에서 연속된 데이터를 빠르게 노출 시켜야 할 떄 ( 채팅, 주식, 데이터 )

 - HTTP 핸드쉐이킹을 하기 떄문에 HTTP 헤더를 사용한다. 그리고 기존 포트 ( 80 / 443) 을 사용한다.

 

 

비슷한 기술

 Polling : 서버로 일정 주기로 request 송신하는 기술

        Realtime 통신에서 폴링을 쓴다면, 언제 통신이 발생할지 모르니 주기적으로 계속 요청을 보내게 되는데,

        이는 불필요한 리소스 ( request, connection) 을 발생한다.

 LongPolling :  요청을 보낸것이 서버에서 일정시간 대기하면서 이벤트를 기다린다.

 Streaming :  서버에서 클라이언트로 연속적인 데이터송신 

         이는 클라이언트에서 서버로의 데이터 송신이 어려워진다.

 

동작방법

핸드쉐이킹이 필요하다 - 얘는 HTTP 나 HTTPS 를 통해서 이루어진다.

이때 , 요청헤더에는

  1. Upgrage : WebSocket 

  2. Security WebSocket Key - 이를 이용해서 서로 신원을 확인한다. 

  3. Origin : 클라이언트 주소

 

그리고, 웹소켓이 연결되면 응답헤더에는

   1. 101 Switching Protocols가 응답이 온다. 

   2.  Security WebSocket Key Accept  가 응답이 온다.  이놈이 클라이언트가 계산한 값과 다르면 수락해주지 않는다.

 

이제 데이터를 주고받는다.

 프로토콜이 WS, WSS 로 변경된다.

 이렇게 데이터를 전송하고 주고받는데,  Message ( Frame + Frame + Frame ...) 라는 단위를 사용한다.

 

클로즈 프레임을 보내며 종료한다.

 

 

 

 

 

 

 

 

Frame 에 대해서

  

   frame 은 작은헤더 + payload로  UTF8인코딩 되어 구성되어 있다.

 

   크기가 작은 헤더는 다음과 같이 구성되어 있다.

    마무리는 Close 프레임을 보내며 마무리!

 

 

필수 라이브러리

 1. HTML5 에서는 그냥 사용 / 그 이전 버전에서는 Sock.Io , Sock JS 사용

 2. STOMP

   - 웹소켓은 형식이 자유롭기 떄문에, 서브 프로토콜이 더 필요했다. 그래서 채팅통신을 위한 프로토콜을 하나 만들었다.

   - CONNECT / SEND / SUBSCRIBE / DISCONNECT  +  Header + Body 형태의 프레임을 사용하게 된다.

'Spring' 카테고리의 다른 글

JPA 영속성에 관하여  (0) 2021.04.08
Clean Code with Spring  (0) 2021.04.06
Stateful / StateLess  (0) 2021.04.05
Controller 테스트 코드짜기  (0) 2021.01.06
인텔리제이 단축키  (0) 2021.01.06