현재 진행 중인 프로젝트에서 웹 소켓을 사용할 일이 있었다. 관련하여 웹을 동적으로 노출시키기 위한 서버-클라이언트 통신 방식들을 정리하고자 한다.
간단하게 상황을 요약하자면, "다른 누군가의 상태를 알기 위해선, 주기적으로 알려주던가 주기적으로 확인하러 가야한다." 이다. 전자를 Poll(push, 같은 개념은 아니지만 적당히 포함한다 정도로 얘기할 수 있다.) 후자를 pull 이라 한다. 당연히 뭐가 더 낫다의 개념이 아닌 쓰임새가 다른 방식이다.
기본적으로 http 프로토콜 특성상, 요청과 응답만이 존재할 뿐 기밀한 연결 따위 유지되지 않는다. 이를 극복하고자 push 를 구현한 방법이 polling, long polling, streaming 등이 있다.
polling
로직이 단순하다. 주기적으로 요청을 보내 응답을 확인하는 것이다. 구현이 단순하고 쉽지만, 불필요한 요청과 응답이 많아 낭비되는 자원이 많다.
long poll
요청을 보낸 후, 서버에서 특정 이벤트가 발생한다면 응답을 보내는 것이다. 이벤트마다 응답을 보내기 때문에, 서버의 상태변화가 잦다면 서버에 많은 부하가 걸릴 것이므로 상태변화가 잦지 않은 서버에 유리하다.
streaming
한번의 요청 후, 필요한 이벤트 발생시 꾸준히 응답을 보내는 것이다. (매 응답시 응답을 완료시키지 않음으로써 연결을 유지하는 방식) 매 응답마다 재 요청을 요구하는 long poll 보다 효율적이며, 서버의 잦은 상태변경에도 유리하다.
위의 방식들로도 실시간 통신을 구현할 수 있으나, 요청과 응답자체가 무겁기떄문에(헤더,바디) 이를 해결하고자 등장한 방식(프로토콜)이다.