Spring4.0이상부터 지원하는 Spring Socket을 이용하여 내가 만든 프로젝트에 실시간 채팅이 가능한 메뉴를 추가해보려고 한다. web socket에 대해서 공부해본적이 없어서 여러 자료들을 찾아보았다..

먼저, 3가지의 Spring Socket 종류에 대해서 알아보자.

 

1. WebSocekt

WebSocket은 W3C표준이다. 브라우저와 서버의 소켓통신을 할때 사용한다. WebSocket은 http상에 존재한다. 

프로토콜은 ws를 사용하지만 이 안에서는 http를 충족한다.

WebSocket은 IE10 이상버전부터 지원이 가능하다. 훨씬 이전에 개발된 방식이지만 여러가지 문제로 10버전 이상부터 지원한다고 한다...

 

2. SocketJS

SocketJS는 브라우저의 소켓을 사용한다. sockjs-client library를 사용하며, IE8 이상버전부터 지원이 가능하다. 

 

 

3. STOMP(Streaming Text Oriented Messaging Protocol) : 토픽 구독방식

스트리밍 텍스트 기반의 간단한 스트리밍 메세지 프로토콜로서 topic/queue방식이다. 토픽에 서브토픽을 주어서 채팅방의 room이름으로서 사용할수 있다. 

SockJS의 Sub Protocol으로서 SockJS를 올려놓고 사용한다. Client는 stomp js library를 쓴다. 이는 spring에 종속적인 방식이라고 할 수 있다.

 

 

 

 

일단 기본적인 WebSocket에 대해서 조금더 자세하게 알아보았다.

 

WebSocket은 사용자의 브라우저와 서버 사이의 인터렉티브 통신 세션을 설정할 수 있게 하는 고급(?)기술이다.

웹 소켓은 HTTP 위에서 돌아간다. (Socket over HTTP) 따라서 https://의 소켓은 wss:// 으로 사용할 수 있다.

wss는 https의 SSL인증서로 암호화 된것이다!!

 

WebSocket은 Long Polling 방식이다.. 폴링과 롱폴링에 대해서 조금 알아보았다.

 

Polling방식이란?

폴링방식은 요청을 주기적으로 하여 결과를 확인하는 방식이다. 원래 HTTP의 통신방식에 대해서 생각해보면... 클라이언트가 요청을 서버에게 보내고, 이를 받은 서버는 요청에 대한 응답을 보내고 응답을 받으면 연결을 끊는다.

이는 단방향 통신이다. HTTP로는 양방향 통신을 할 수 없다.

폴링방식은 주기적으로 요청을 주어 결과를 받기 때문에 양방향 통신이 가능하지만 실시간으로 주는것은 불가능하다.

실시간처럼 비슷하게 만들 수는 있지만... 그렇게 하려면 요청간격을 줄여햐하는데 이런 방식이면 서버와 클라이언트 모두에게 부담이 된다. 그래서 폴링 방식을 조금 개선한것이 롱폴링 방식이다.

 

Long Polling방식이란?

기본적으로 클라이언트가 계속적(주기적)으로 요청을 하는것은 기존 폴링방식이랑 비슷하다. 차이점은 폴링방식은 주기적으로 요청을 하였다면 롱폴링은 time out이 될 때까지 그 요청에 대한 응답을 기다린다...

임의적으로 끊기 전까지 항상 연결은 유지가 되어있기 때문에 실시간으로 통신이 가능하게 된다.

 

 

         Client ---------(Handshake)------------>server
        <--------(connection open)------

         <---(Bi-directional messages)--->
        <---(one side closes channel)--->

 

 

클라이언트가 서버에게 Handshake방식으로 요청을 하면 그 요청을 받은 server는 connection open을 한다. 웹 소켓으로 연결이 된 클라이언트와 서버는 양방향 통신(Bi-directional)을 하면서 메세지를 주고 받는다. 

server측에서 연결을 끊으면 client의 연결도 끊긴다. client측에서 연결을 끊으면 해당 session에 해당하는 연결이 끊긴다.

 

왜 요청방식이 Handshake일까? Handshake가 무엇일까?????

 

WebSocket Handshake

HTTP에서 WebSocket으로의 프로토콜 전환을 WebSocket Handshake라고 한다. 브라우저가 HTTP에서 WebSocket으로 프로토콜을 전환하려는 요청을 할 때, Header에 Upgrade속성을 추가하여 보내게 된다.

서버는 Upgrade속성을 통해 프로토콜의 전환 요청을 받고 이에 동의하게 되면 서버와 브라우저는 ws프로토콜을 사용하게 되는 것이다.

 

핸드쉐이크는 나중에 실제 코드에서 어떻게 사용하여 헤더에 속성이 어떻게 담겨져서 보내지는지 직접 알아보도록 하자..

'JAVA > Spring' 카테고리의 다른 글

싱글톤 패턴과 스프링 컨테이너  (0) 2021.12.15
Spring Socket에 대해 알아보자! - 2. WebSocket 만들어보자  (0) 2020.06.23
Spring WebSocket에 대한 내용 정리  (0) 2020.06.11
MyBatis  (0) 2020.04.21
Spring JDBC  (0) 2020.04.20

+ Recent posts