TIL 2023/01/16 SSE

YEONGDO·2024년 1월 16일
0

인터넷은 웹 브라우저와 웹 서버 간의 데이터 통신을 위해서 HTTP 표준 위에 구축되어 있다. 대부분의 경우 웹 브라우저인 클라이언트가 HTTP 요청을 서버에 보내고, 서버는 적절한 응답을 반환하는데 이런 왕복 통신은 주소를 브라우저에 입력했을 때 웹 페이지를 받게 되는 과정이다.

이러한 HTTP 표준은 광범위하게 지원되지만, 애플리케이션이 연속적인 정보를 서버에 전송하거나, 실시간으로 업데이트된 서버의 정보를 클라이언트에게 보내야 하는 경우 지속적인 HTTP 요청을 하게 되기에 비용면에서 매우 비 효율적이다. 이런 상황에서 폴링, 웹소켓, 그리고 SSE가 등장했는데, 이들은 데이터 스트림의 속도와 메모리 효율성에 중점을 둔 프로토콜

1. Short Polling
2. Long Polling
3. SSE(Server-Sent-Events)
4. WebSocket

1. Short Polling

Short Polling은 클라이언트가 서버로부터 정기적인 정보를 받기 위한 프로토콜이다. 클라이언트가 주기적으로 서버로 요청을 보내 데이터를 받아오는 방법이다.

클라이언트가 Http Request를 서버로 계속 보내서 이벤트 내용을 전달받는 방식이며, 클라이언트가 지속적으로 Request를 서버에 보내기 때문에 클라이언트가 많아지면 서버의 부담이 증가. 또한 TCP의 connection을 맺고 끊는 것 자체가 매우 무겁고, 이에 따라 실시간으로 변화되는 빠른 정보의 응답을 기대하기는 어렵다.

하지만 클라이언트와 서버의 구현이 모두 단순하다는 장점이 있고, 서버가 요청에 대한 부담이 크지 않고 요청 주기를 넉넉하게 잡아도 될 정도로 실시간성이 중요하지 않다면 고려해 볼 만한 방법이다.

2. Long Polling

Long Polling은 Short Polling 보다는 더 효율적인 방식이다.

Long Polling은 Short Polling에 비해 동일한 양의 데이터를 클라이언트에게 전송하는데 필요한 HTTP 요청 수를 줄일 수 있다. 하지만 서버로부터 응답을 받고 나면 다시 연결 요청을 하기 때문에, 상태가 빈번하게 바뀐다면 연결 요청도 늘어나 서버에 부담이 가는 것은 변하지 않는다.

따라서 실시간 메시지 전달이 중요하지만 서버의 상태가 빈번하게 변하지 않는 경우에 적합.

3. SSE(Server-Sent-Events)

SSE는 서버와 한번 연결을 맺고 나면, 일정 시간 동안 서버에서 변경이 발생할 때마다 서버에서 클라이언트로 데이터를 전송하는 방법.

SSE는 상황에 따라서 응답마다 다시 요청을 해야 하는 Long Polling 방식보다 효율적이다. SSE는 서버에서 클라이언트로 text message를 보내는 브라우저 기반 웹 애플리케이션 기술이며 HTTP의 persistent connections을 기반으로 하는 HTML5 표준 기술그러나 HTTP를 통한 SSE(HTTP/2가 아닐 경우)는 브라우저 당 6개의 연결로 제한되므로, 사용자가 웹 사이트의 여러 탭을 열면 첫 6개의 탭 이후에는 SSE가 작동하지 않는다는 단점도 있음. (HTTP/2에서는 100개까지의 접속을 허용)

전반적으로 SSE는 클라이언트가 서버와 크게 통신할 필요 없이 단지 업데이트된 데이터만 받아야 하는 실시간 데이터 스트림에 대한 구현이 필요할 때는 매우 훌륭한 선택이다.

4. WebSocket

WebSocket은 OSI 네트워크 모델의 4 계층 프로토콜인 TCP에 기반한 양방향 메시지 전달 프로토콜 WebSockets은 프로토콜 오버헤드가 적고, 네트워크 스택에서 더 낮은 수준에서 동작하기 때문에 HTTP보다 데이터 전송이 빠르다.

웹 소켓의 가장 큰 장점은 속도이다. 클라이언트와 서버는 메시지를 전송할 때마다 서로의 연결을 찾아서 다시 설정할 필요가 없고 웹 소켓 연결이 설정되면 데이터는 어느 방향으로든 즉시 안전하게 전송될 수 있다. (TCP이기에 메시지가 항상 순서대로 도착하도록 보장됨)

하지만 단점은 초기 구현에 상당히 많은 비용이 들어간다는 점. 웹소켓은 멀티 온라인 게임과 같은 실시간 상태 업데이트와 긴밀한 동기화를 통해 분산된 사용자에게 전송해야 하는 경우 유용하다.

따라서 전반적으로 웹 소켓은 빠른 고품질의 양방향 연결이 필요하다면 좋은 선택이지만, 시스템에 상당한 복잡성을 추가하고 구현하는 데 많은 투자가 필요하므로 폴링이나 SSE가 적합하지 않은 경우에만 사용하는 것을 권장

느낀점

나는 이번 프로젝트에 실시간 알림을 구현할 예정인데 SSE가 적합한 거 같다!!

profile
개발 블로그

0개의 댓글