Skip to content

[채팅 스터디] 어떤 기술을 사용할까 _윤서

Yunseo Hwang edited this page Jan 17, 2022 · 4 revisions

작성자: @Yunseo Hwang.

작성일: 2022.01.17.

Description: 채팅 기능 - 어떤 기술을 사용할까.


HTTP/HTTPS를 사용한 실시간 통신의 구현

WEB에서 가장 기본이 되는 프로토콜은 HTTP/HTTPS이다. 그리고 이 프로토콜의 특징은 Stateless하다는 것이다.

HTTP/HTTPS를 사용해서 실시간 통신을 구현하고 싶다면 직접적인 방법보다는 간접적인 방법을 사용해야 한다.

Polling

기본적으로는 서버가 먼저 클라이언트에게 응답을 줄 수 있는 방법이 없기 때문에 Polling이라는 기법을 사용하게 된다.

Polling은 기본적으로 클라이언트가 서버에게 주기적으로 요청을 보내 응답 여부를 체크하는 방식이다.

여기서 가장 많이 사용되는 기법은 Long Polling 이다.

Long Polling

Long Polling은 요청을 했을 때 응답할 데이터가 없으면 연결이 끊어질 때까지 연결을 시도하고 연결이 끊어지면 다시 연결을 요청하는 방법이다.

서버와 클라이언트는 연결을 계~~~속 유지하면서 통신을 한다. 그래서 Stateless 프로토콜 위에서 실시간 통신을 구현해야 할 때(ex. 채팅) 많이 사용된다.

실시간 통신에서 HTTP/HTTPS의 대안

실시간 통신에 있어서 HTTP Polling 방식은 선택 가능한 방법이긴 하지만 불필요한 네트워크 비용이 발생할 수 있는 방법이었다.

그래서 2011년 WebSocket이라는 새로운 프로토콜이 제안된다.

websocket

WebSocket은 TCP 기반 소켓 API를 대체하기 위한 목적으로 HTML5 사양에서 설계되었고 HTTP 프로토콜과의 호환을 지원한다.

WebSocket Emulation

WebSocket은 대부분의 브라우저에서 지원을 하긴 하지만 일부 브라우저의 경우 지원을 하지 않는다. 이럴 때는 Long Polling 등 HTTP 기반의 기술로 시도를 해야 하는 데 이렇게 WebSocket 연결이 실패했을 때 다른 기술을 사용하는 방식을 WebSocket Emulation이라고 한다.

연결의 안전성을 위해서는 이러한 WebSocket Emulation을 사용해야 하며 이를 쉽게 지원하기 위한 라이브러리로 socket.io, SockJS 등이 있다.

흔히 들어본 socket.io는 WebSocket과 별개의 기술이 아니라 WebSocket 기술을 기반으로 WebSocket 연결이 실패했을 때 다른 기술로 시도하는 WebSocket Emulation 기능을 비롯한 여러 유틸 기능들을 포함하는 라이브러리일 뿐이다.

그래서 어떤 것으로 구현할 것인가

우리가 선택할 수 있는 선택지는 프로토콜 레벨에서는 HTTP와 WebSocket으로 나눌 수 있고 WebSocket에서는 크게 WebSocket 자체를 사용하는 방법과 WebSocket Emulation을 구현한 라이브러리를 선택하는 방법으로 구분할 수 있다.

HTTP를 기반으로하는 Long Polling 등의 방법을 선택할 경우 브라우저 호환성 이슈는 전혀 없겠지만 불필요한 네트워크 비용이 발생할 수 있고

WebSocket 자체를 사용하는 방법은 브라우저 호환성으로 인해 연결의 신뢰성을 보장하기 어렵다.

그렇기 때문에 최선의 방법은 WebSocket을 사용하되 WebSocket Emulation 기법을 적용하여 브라우저 호환성 이슈를 보완하는 것이고

이를 가장 쉽게 적용하는 것이 WebSocket Emulation 기법을 이미 구현한 라이브러리를 사용하는 것이다. + 여러 유틸 기능들도 제공하는,,,,

라이브러리들

라이브러리들을 살펴봤을 때 Socket.io가 가장 Star 수도 많고 버전도 안정적인 것으로 판단된다.

그러니 Socket.io를 선택해서 진행하면 좋지 않을까....!

Clone this wiki locally