Computer Science/Network

[네트워크/Network] WebSocket이란? (feat. Pooling)

예민한고라니 2022. 7. 17. 20:57

웹소켓 탄생 배경

웹소켓에 대해 이야기 해보기전, 우선 polling 방식에 대해 이야기를 해보자.

 

우리가 흔하게 아는 클라이언트와 서버의 통신방법이다 (RestAPI 방식)

클라이언트에서 매번 필요할때 마다 request 하고 서버에서 response 해주는 방식이다.

 

하지만 실시간 검색어나 채팅 서비스를 생각해보자.

매번 채팅이 도달할때마다, 또는 실시간 순위가 바뀔때마다 클라이언트에서 요청을 보내야한다(!)

이를 위해 주기적으로 호출해서 서버에 내 상태를 알려주어야 하는데 이는 굉장히 낭비가 심하게 된다.

굉장히 낭비가 심하다 이것이 바로 polling 방식이다.

기본적인 게시판같은 실시간 상태 공유가 필요없는 웹게시판에서 사용하게 된다.

 

 

이를 해결하기 위해 나온게 바로 웹소켓이다! 

 

웹소켓이란?

웹소켓은 서버와 클라이언트 간의 효율적인 양방향 통신을 실현하기 위한 방식이다.

이를 이용하여 하나의 HTTP 접속으로 양방향 메세지를 자유롭게 주고받을 수 있다.

즉, 사용자는 새로고침과 같은 재접속 없이도 해당 웹사이트의 내용을 지속적으로 업데이트 할 수 있다는 것

출처 : https://ably.com/blog/introducing-the-websocket-handbook

좀더 자세히 보자면, 

  • 첫번째, 클라이언트에서 서버로 HTTP 요청을 보내 연결됨을 handshake를 통해 확인한다 
  • 이때 서버에서 클라이언트로 HTTP 101 Switching Protocols을 전송한다.
  • 이후 full-duplex persistent, 즉 양방향 통신을 진행한다!

 

 

몇가지 특징

하지만, HTTP와 달리 stateful protocol이기 때문에 서버와 클라이언트 간의 연결을 항상 유지해야하며,

이는 코딩의 복잡성을 가중시킨다

또한 socket 연결 유지자체가 큰 비용이며, cpu에 큰 부담이 될 수 있다.

자바에서는 이를 STOMP를 이용하여 구현할 수 있다!