우선 SSE 와 WebSocket에 대한 구현방법을 원하시는 분은 해당 포스팅 을 보고 와주세요.
SSE 와 WebSocket
SSE 는 Server-Send-Events 의 약자로 WebSocket과 같이 서버와 클라이언트간 데이터 송수신할 수 있는 기술입니다.
일반적으로 Connection Less
가 아닌 연결을 유지하여 실시간으로 데이터가 들어올 때 마다 이벤트를 발생시키는 구조입니다. 따라서 WebSocket으로 연결할 땐 서버의 URL 주소를 ws://localhost
처럼 해주어야 합니다.
다만 SSE 는 서버 -> 클라이언트로 단방향 구조로 양방향 구조
인 WebSocket 보다 가볍다는 장점을 가지고 있지만 SSE
는 클라이언트가 접속을 종료해도 서버에서 알 방법이 없습니다.
따라서 Last Event ID 헤더를 이용하여 클라이언트가 마지막으로 수신받은 데이터를 확인하여 받지 못한 데이터를 다시 보내줘야 하는 번거로움이 있었습니다.
SSE의 특징
- 서버에서 클라이언트로 실시간
Streaming
을 한다.
- 연결된 상태로 서버에서 클라이언트로 단방향으로만 데이터가 전송된다.
- 클라이언트의 연결이 끊겨도 서버에서는 알 방법이 없다. ( lasy event id 를 활용하여 극복 가능 )
SSE 의 장점
- HTML과 Javascript만으로 구현할 수 있다.
- HTTP를 제외한 다른 프로토콜을 사용하지 않아 가볍다.
- 웹 표준으로 IE를 제외한 모든 브라우저에서 사용이 가능합니다.
- IE의 경우 Polyfill 를 통한 지원이 가능합니다.
- polyfill 는 브라우저가 지원하지 않는 API 플러그인이나 Javascript를 흉내내는 것을 말합니다.
SSE의 단점
- payload의 크기가 제한적이여서 많은 데이터를 담을 수 없다.
- SSE를 지원하지 않는 경우 중요한 알림을 받을 수 없다.
Socket의 특징
- Socket Connection을 이용하여 양방향 통신을 한다.
- 일정시간 동안 HTTP와 TCP/IP 연결을 통해 통신을 한다.
Socket의 장점
- 양방향 통신이 가능하다.
- 최대 동시 접속 수가 많다.
- 대부분 브라우저에서 지원한다.
Socket의 단점
- 연결이 끊기면 재접속 시도를 하지 않는다.
- 배터리 소모량이 크다.
FCM는 무엇인가?
FCM은 Firebase Cloud Messanger 의 약자로 모바일이나 웹 어플리케이션의 메세지 및 알림을 받기 위한 크로스 플랫폼 클라우드 솔루션입니다.
클라이언트가 FCM 서버에 등록되는 단계
- 먼저 클라이언트는 키를 받기 위해 Firebase 서버에 요청을 보낸다.
- Firebase 서버에서 키를 받아 클라이언트에게 전달한다.
- Firebase 서버에서 받은 키를 서버에 전송한다.
- 서버는 전달 받은 키를 DB에 저장하고 모바일의
Identification
으로 사용
서버가 스마트폰에 데이터가 전달되는 과정
- DB에서 특정 클라이언트의 키를 추출
- 특정 키와 데이터를 HTTP 를 이용하여 Firebase에게 전달
- Firebase는 전달받은 키를 식별하여 클라이언트에게 데이터를 전달
FCM의 장점
특정 플랫폼에 종속받지 않고
데이터를 전송할 수 있습니다. ( 웹이나 , ios , 안드로이드 )
- FCM에서 제공하는 다양한 기능을 활용할 수 있습니다.
- 기능 구축에 적은 시간을 사용한다.
- 클라우드 메신저 서버를 중간에 둠으로서 사용자는
낮은 배터리
와 네트워크
만으로 메세지를 송수신할 수 있다.
FCM의 단점
- SSE와 달리 별도의 여러 설정이 필요하다.
- SSE 보다 느리기 때문에 연성 실시간 ( soft real-time ) 에 적합하다.
- real-time 의 성질을 가지고 있지만 연결 상태 , 데이터의 크기에 따라 지연될 수 있다.
총 정리
SSE 와 Socket , FCM 은 실시간으로 메세지 및 알림을 통신하기 위한 기술입니다.
다만 FCM 은 SSE 와 Socket 보다 더 많은 플랫폼을 수용할 수 있으며 , 중간 서버를 두기고 통신하기 때문에 배터리를 크게 소모하지 않습니다.
물론 SSE 나 Socket 보다 속도가 느려질 수 있다는 단점을 가질 수 있기 때문에 무조건 FCM이 좋다고 할 순 없죠.
따라서 실시간 성이 중요할 때 Socket과 SSE 를 사용하고 , 배터리 효율 및 연성 실시간을 사용하거나 , 다양한 플랫폼 ( 웹 , 앱 , ios )을 사용한다면 FCM을 고려해보는 것이 좋겠습니다.
참고
참고 블로그 : 링크