프로젝트에서 실시간 알림 기능 구현해야했다.
알림 기능은 대표적으로 뉴스피드나 댓글 알림처럼 "실시간으로 서버의 변경사항을 웹 브라우저에 갱신"해줘야 하는 경우이다.
하지만, HTTP는 비연결성이기 때문에 Server가 Client와 지속적으로 연결이 되어있지 않기 때문에 보낼 수 없는 상황이 발생한다.
Client의 요청이 있어야만 Server가 응답을 할 수 있다.
이를 해결하기 위한 기능은 대략 4가지이다.
1. Polling
2. Long Polling
3. Socket
4. SSE (Server Sent Event)
우리는 알림 기능 구현을 위해 SSE를 선택했다.
그 이유를 위 4가지 방식을 대략 정리하고 마지막에 작성하겠다.
Polling
Client가 주기적으로 서버로 요청을 보내는 방법
- 일정 시간마다 서버에 요청을 보내 데이터가 갱신되었는지 확인하고 만약 갱신되었다면 데이터를 응답 받는다
- 클라이언트와 서버 모두 구현이 단순하다
- 실시간성이 중요하지 않다면 고려해 볼 만한 방법
- 요청 주기가 짧지 않아도 된다면 서버가 요청에 대한 부담이 크지 않기 때문
Long polling
요청을 보내고 서버에서 변경이 일어날 때까지 대기하는 방법
- 실시간 메시지 전달이 중요하지만 서버의 상태가 빈번하게 변하지 않는 경우에 적합
- 서버가 빈번하게 변한다면 매번 연결 요청을 다시 하게되고 요청이 증가하기 때문에 부담되기 때문
Web Socket
Transport protocol의 일종으로 양방향 통신을 실현하기 위한 구조
- 클라이언트와 서버가 서로에게 원할 때 데이터를 주고 받을 수 있다
- 구현이 어려움
- 서버와 클라이언트 간의 Socket 연결을 유지하는 것 자체가 비용
- 트래픽 양이 많은 서버같은 경우에는 CPU에 큰 부담
SSE
서버와 한번 연결을 맺고나면 일정 시간동안 서버에서 변경이 발생할 때마다 데이터를 전송받는 방법
- 서버 -> 클라이언트 단방향 통신
- 응답마다 다시 요청을 해야하는 Long polling 방식보다 효율적
- 별도의 프로토콜을 사용하지 않고 HTTP 프로토콜만으로 사용할 수 있기 때문에 구현이 용이
SSE 선택이유
- 매번 연결 요청을 해야하는 Polling, Long Polling 방식은 적합하지 않다
(우리 서비스는 서버의 변화가 자주 발생한다고 가정)
- 데이터가 서버 → 클라이언트로 단방향으로만 이동
→ 양방향 통신의 웹소켓은 투머치