
PEANUT 프로젝트를 진행하면서 실시간 알림 서비스를 구현해야 하는데, 이때 새로 알게 된 FCM에 대해서 공부한 내용들을 바탕으로 포스팅 하려고 합니다. 실시간 알림 서비스를 구현하기에 앞서, 이 기능을 웹소켓으로 구현할 예정이었습니다. 그러나 어플리케이션을 사용하지 않을 때에도 알림이 가야하는 특성상 웹소켓은 맞지 않았고, 알아보니 FCM을 활용하면 실시간 알림, 푸쉬 알림을 어플리케이션을 동작하지 않고도 사용할 수 있다는 것을 알았습니다.
웹 소켓은 클라이언트와 서버 간의 지속적인 연결을 유지하며 실시간 양방향 통신을 가능하게 하는 기술이며, TCP 연결을 기반으로 하기 때문에, 클라이언트 측의 네트워크 상태나 어플리케이션이 종료된 상황에선 연결할 수 없기 때문입니다. 즉, 사용자가 만약 어플리케이션을 실행하고 있지 않거나 백그라운드 상태로 전환되면, 웹소켓 연결이 끊어지고 실시간 알림을 받지 못합니다. 따라서 실시간 알림을 애플리케이션이 동작하지 않는 시점에서 실시간 알림을 받아야 하는 경우이기 때문에 웹소켓은 적합하지 않다고 판단했습니다.
만약 애플리케이션이 동작하지 않을 때에도 실시간 알림을 받아야 한다면 어떤 방식으로 구현해야 하는지에 대한 의문점을 가지고, 정보들을 알아보는 와중 FCM이라는 것을 활용하면 이 문제를 해결할 수 있다고 판단했습니다.
만약 ios,안드로이드,웹 등의 플랫폼에서 푸쉬알림을 보낸다면 각각 플랫폼의 환경에 맞춰 개발해야 하는 불편함이 있지만, 앞서 말한 것처럼 FCM은 교차 플랫폼 메시지 솔루션이기 때문에 FCM을 이용하여 개발을 한다면, 플랫폼에 종속되지 않으면서 푸쉬 알림을 전송할 수 있습니다. 또한 애플리케이션을 동작하지 않아도 푸쉬 알림을 전송할 수 있습니다.
실시간 푸쉬 알림
FCM은 애플리케이션이 백그라운드에 있거나 종료된 상태에서도 실시간으로 푸시 알림을 보낼 수 있는 기능을 제공합니다. 이를 통해 사용자는 중요한 알림을 놓치지 않고 받을 수 있습니다.
다양한 플랫폼 지원:
FCM은 안드로이드, iOS, 웹 등 다양한 플랫폼에서 푸시 알림을 보낼 수 있도록 지원합니다. 이로 인해 멀티플랫폼 애플리케이션에서 통합된 푸시 알림 기능을 쉽게 구현할 수 있습니다.
유연한 메시지 전송 옵션
배터리 및 데이터 효율성:
클라이언트 장치에서 효율적으로 메시지를 처리하기 때문에 배터리 소모와 네트워크 사용량을 최소화합니다. 구글의 인프라를 사용하여 푸시 메시지를 전달하기 때문에 배터리와 데이터 사용 효율성이 높습니다.
주문형 전송:
FCM을 통해 특정 사용자에게 타겟팅된 메시지를 보낼 수 있습니다. 이를 위해 주제(Topics), 그룹(Condition), 단일 장치, 다수 장치 등 다양한 전송 방법을 제공합니다.
송신자는 주로 앱 서버, HTTP 프로토콜을 사용하는 서버나 Firebase Console과 같은 GUI 도구를 통해 메시지를 보낼 수 있지만, 수신자는 일상적으로 흔히 사용하는 iOS나 Android 운영체제를 사용하는 모바일 기기입니다.
FCM의 백엔드 서버는 실질적으로 앱 서버의 요청을 받아 메시지를 처리하는 역할을 합니다.
FCM 클라우드 메시지의 흐름은 다음과 같습니다.
1. 앱 서버에서 FCM Backend 서버에 클라이언트 앱으로 보낼 메시지를 담은 정보와 서버의 인증 정보를 클라이언트 토큰을 담아서 HTTP POST 요청을 보냅니다.
요청을 받은 FCM Backend 서버는 요청을 통해 받은 메시지의 이상 유무에 따라 서버에 적절한 응답을 보냅니다.
이후 FCM Backend 서버에서 여러가지(우선 순위, 클라이언트 앱과의 통신 가능 여부 등)을 고려하여 매세지를 클라이언트 앱에 보냅니다.
클라이언트 앱에서는 받은 메세지를 적절하게 처리하고 응답 메세지를 FCM Backend 서버로 보내게 됩니다.
-요약-
앱 서버에서 FCM Backend 서버에 메시지 요청을 보내고, FCM Backend 서버는 사용자 기기에서 실행되는 클라이언트 앱에 메시지를 보내게 된다.
메시지를 수신할 클라이언트는 자신의 정보를 FCM Backend 서버에 등록해야 해야합니다.
메시지를 전송할 주체(앱 서버)는 등록된 정보를 획득해야 하고, 해당 정보로 다운 스트림 메시지를 전송합니다.
FCM을 사용하기 위해서는 FCM Backend 서버와 통신을 위한 어플리케이션 서버를 구축하기 위해서 3가지 규칙을 지켜야 합니다.
FCM Backend 서버에 FCM에서 지정한 형식의 메시지 요청을 보낼 수 있어야 합니다.
지수 백오프를 사용하여 요청을 처리하고 다시 보낼 수 있어야 합니다.
지수 백오프 : 요청이 실패할 때마다 다음 요청까지의 유휴시간 간격을 n배씩 늘리면서 재요청을 지연시키는 알고리즘이다. 그 이유는 임의 지연을 사용해서 연쇄 충돌을 방지하기 위해서 사용합니다.
서버 승인 사용자의 인증 정보와 클라이언트의 등록 토큰을 안전하게 저장 할 수 있어야 한다.
서버 승인 사용자의 인증 정보 : 메시지를 보낼 앱 서버가 인증된 서버라는 것을 증명하는 정보.
클라이언트의 등록 토큰 : 메시지를 보내고자 하는 디바이스의 정보.
FCM 공식문서
Spring Boot Firebase Cloud Message(FCM) 푸시 메시지 API 구축 -1 : firebase-admin
FCM에 대해서 알아보자