본문 바로가기
개발자 일지/기타

[양방향 통신 방법]폴링, 롱 폴링, 웹소켓(+STOMP, SockJS)

by 네빌링 2024. 9. 19.
반응형

HTTP 프로토콜을 통한 폴링, 롱폴링 방식의 양방향 통신에 대해 알아보고 이를 발전시킨 프로토콜 웹소켓에 대해 공부해보려고 합니다. 출퇴근 시간에 유튜브를 통해 간단히 공부해서 정리가 좀 되었는데요. 포스팅해서 남겨보겠습니다.

 

 

목차

[같이 보면 좋은 포스팅 모음]

[인프런 김영한님 강의]모든 개발자를 위한 HTTP 웹 기본 지식1

[인프런 김영한님 강의]모든 개발자를 위한 HTTP 웹 기본 지식2

[인프런 김영한님 강의]모든 개발자를 위한 HTTP 웹 기본 지식3

 

모두의 네트워크 정리1

모두의 네트워크 정리2


1. 양방향 통신 방법-폴링, 롱 폴링

클라이언트와 서버의 실시간 양방향 통신을 하기 위해서는 요청 상태를 유지해줘야 합니다. 그러나 HTTP는 stateless(상태비저장), 비연결성이라는 특징을 갖고 있는 프로토콜입니다. 그렇기 때문에 요청은 각각 개별적이고 상태를 유지해줄 수 없습니다.

 

그러나 HTTP를 통해 유사한 실시간 양방향 통신을 구현할 수 있는 방법이 있는데요. 바로 폴링(Polling)롱 폴링(Long Polling) 방식입니다.

 

폴링(polling)방식은 요청을 서버에 전달하고, 서버는 응답을 주는 것을 계속 반복하면서 서버의 상태변경이 일어났을 때 클라이언트에게 전달해주는 방식입니다. 이메일을 예를 들어보겠습니다. 이메일 서버에 고객이 게속 이메일이 왔는지 확인 요청을 보내고 서버는 이메일 없음이라는 상태를 계속 보내주다가 이메일이 들어오면 그때서야 이메일을 받은 상태를 전달해주는 것입니다.

 

상상만 하더라도 요청과 응답이 반복되기 때문에 비효율적이고 리소스 낭비가 심한 방식입니다. 또한 실시간이라고 하지만 응답을 주기 바로 직전에 이메일 체크를 해서 보내기 때문에 그 시기를 벗어나서 이메일을 받으면 실시간 응답이 아니라 딜레이가 있는 응답을 주는 것이죠.

 

롱 폴링(Long Polling)은 이를 조금 더 개선한 방식입니다. 서버가 상태변경이 일어날 때까지 요청 이후 응답을 지연시키는 방식입니다. 요청이 한 개면 괜찮지만 여러 클라이언트에서 요청이 온다면 서버 응답을 주기 위한 지연과 오픈이 길어지기 때문에 서버 부담이 큰 방식입니다.

 

HTTP 프로토콜만으로는 여러모로 실시간 양방향 통신이 부족한 점이 있습니다. 그래서 웹소켓이라는 프로토콜이 탄생하였습니다.

 

2. 양방향 통신 방법-웹소켓

 

웹소켓은 많이 들어보셨겠지만 HTTP 프로토콜을 이용한 폴링, 롱 폴링 방식을 개선하면서 만든 프로토콜입니다. 채팅과 같은 프로그램에 쓰이는 프로토콜로, 요청을 서버에 보내고 서버가 이를 인지해서 서로 양방향 통신 구간을 열어두는 방식입니다. 정말 실시간으로 통신을 할 수 있게 된 것이죠.

 

그래서 아래 그림과 같이 3단계로 나뉘게 됩니다.

 

출처: https://medium.com/@yg17381/a-simple-explanation-of-what-a-websocket-is-74b9bb14e85b

 

위의 그림과 같이 핸드셰이크는 최초에 HTTP 프로토콜을 통해 서버에 요청을 보내고, 서버에서는 웹소켓 프로토콜로 업그레이드를 해줍니다. 이 과정이 끝나면 양방향 통신이 연결되는 것입니다. 이후 클라이언트나 서버에서 원한다면 클로즈 핸드셰이크를 통해 통신을 종료할 수 있습니다.

 

3.웹소켓 보완 프로토콜 및 라이브러리

 

1)STOMP

 

웹소켓만으로 부족한 점이 있기 때문에 보완해주는 프로토콜(엄밀히 말하면 웹소켓과 함께 사용할 수 있는 메시지 전달 규격)이 필요한데 그것이 STOMP입니다. STOMP는 메시지 프로토콜로 웹소켓 연결 상태에서 메시징 시스템을 구축할 수 있도록 도와줍니다. json등의 패턴을 사용해서 보낼 수 있죠. RabbitMQ같은 메시징 브로커와도 함께 사용되는 프로토콜입니다.

 

2) SockJS

 

SockJS웹소켓이 불가능한 브라우저에서 소켓통신을 하도록 도와주는 라이브러리입니다. 사실 소켓통신이라기보다 웹소켓을 사용할 수 없다면 HTTP 프로토콜을 통한 양방향 통신(폴링, 롱폴링)을 하도록 지원해주는 라이브러리입니다.

반응형