FCM이란
FCM이란 메시지를 무료로 전송할 수 있는 크로스 플랫폼 메시징 솔루션을 의미한다.
크로스 플랫폼이기 때문에 사용자의 환경이 iOS인지 Android인지 등을 고려하지 않고 편리하게 푸시 알림을 보낼 수 있는 장점을 가지고 있다.
우리가 모바일에서 어플리케이션을 이용하여 게임을 할 때 이벤트 등의 정보를 푸시 알림을 통해 받아 본 경험이 있을 것이다.
이 알림을 주기 위해 개발자들이 사용하는 도구가 FCM에 해당한다.
FCM 아키텍처
FCM 공식문서에 제공된 아키텍처 구조는 위와 같다.
Message building and targeting
FCM을 사용하여 메시지를 전송하려는 유저가 책임을 가진 파트라고 생각하면 된다.
Firebase에서 제공하는 GUI를 사용해서도 알림을 작성할 수 있지만, FCM을 사용하여 메시지를 전달하려고 하는 개발자들은 보통 코드레벨에서 이러한 기능을 구현하게된다.
FCM에서는 코드 레벨에서 메시지 구성과 전송 요청을 가능하게 하기 위해 Firebase Admin SDK를 제공하고 있으며, Java, Node.js 등 다양한 언어를 지원하고 있다.
아래는 NodeJS에서 사용할 수 있는 Firebase Admin SDK의 repository이다.
(https://github.com/firebase/firebase-admin-node)
FCM backend
사용자가 GUI, 혹은 Firebase admin SDK를 사용하여 만든 메시지 요청을 수락하고, `메시지 팬아웃`을 수행하거나 메시지 ID와 같은 메타데이터를 생성한다. 여기서 `메시지 팬아웃` 이란 `브로드캐스팅`을 의미하며 특정 토픽을 구독하고 있는 모든 클라이언트에게 메시지를 전달하는 것을 의미한다.
Platform-level message transform
기기로 타겟팅된 메시지를 라우팅하며, 플랫폼 별로 메시지 전송에 필요한 작업을 처리하는 레이어에 해당한다.
SDK on device
사용자 앱의 포그라운드/백그라운드 상태나 애플리케이션 로직에 따라 메시지가 처리된다.
`포그라운드`란 어플리케이션을 실제 화면에 띄워서 사용하고 있는 상태로, 예시를 들면 현재 롤토체스 어플리케이션을 실행시켜서 게임을 하고 있는 상황을 의미한다.
`백그라운드`란 어플리케이션이 화면에 떠 있는 상태는 아니지만, 보이지 않는 상태로 실행중인 상태를 말한다.
FCM 메시지의 구성
알람 전송을 위해 메시지를 사용자가 구성하고 FCM의 백엔드로 요청하기 때문에 사용자가 메시지 구성 과정에서 지켜야하는 양식이 존재한다. (마음대로 메시지를 구성해서 보내면, 당연히 FCM 백엔드에서는 이를 제대로 해석하지 못한다.)
사용자가 전송할 수 있는 메시지 유형에는 `알림 메시지`와 `데이터 메시지` 두 종류가 존재한다.
`알림 메시지`는 우리가 일반적으로 알고 있는 알림에 해당하며, `데이터 메시지`는 앱에서 따로 메시지 처리 방식을 정의하고 처리하고 싶은 경우 사용한다.
`알림 메시지`에는 사용자에게 메시지를 보여주기 위해 사용되는 key가 사전 정의되어 있기 때문에, 이러한 양식에 맞추어 메시지를 작성해야 한다.
`데이터 메시지`는 사용자가 정의한 커스텀 key-value로 메시지를 구성할 수 있다.
// 알림 메시지 전송 예시
{
"message":{
"token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
"notification":{
"title":"Portugal vs. Denmark",
"body":"great match!"
}
}
}
위와 같이 메시지를 작성하여 FCM 백엔드로 요청하면, token에 해당하는 유저에게 제목이 `Portugal vs. Denmark` 이고 내용이 `great match!` 인 알람이 전송된다.
이 외에도 다양한 key가 사전 정의되어 있는데, 아래 링크를 통해 메시지 전송 요청에서 사용할 수 있는 양식을 확인할 수 있다.
// 데이터 메시지 예시
{
"message":{
"token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
"data":{
"Nick" : "Mario",
"body" : "great match!",
"Room" : "PortugalVSDenmark"
}
}
}
데이터 메시지 전송 시, data key 내부에 원하는 key 값을 지정하여 메시지를 전송할 수 있다.
FCM 토큰 관리 수칙
FCM API를 사용해서 전송 요청을 수행하는 애플리케이션에서 따라야 하는 몇 가지 기본 사항이 제시되어 있다.
1. 서버에 등록 토큰을 저장할 것
앱을 처음 시작하는 경우 발급 토큰을 타임스탬프와 함께 앱 서버에 저장해야 한다.
2. 저장된 토큰 중 비활성화된 토큰을 삭제할 것
FCM에서 제공해주는 응답을 사용하여, 토큰이 비활성화된 것이 확인되면 이를 삭제해야한다.
HTTP v1 API를 예시로 들면, 아래와 같은 오류 메시지를 확인했을 때 전송 요청이 비활성화된 토큰을 기반으로 했거나, 잘못된 토큰을 타겟팅 했음을 알 수 있다.
- UNREGISTERED(HTTP 404)
- INVALID_ARGUMENT(HTTP 400)
FCM 에서는 이러한 토큰들을 최대한 최신 상태로 서버에서 보존할 것을 권장하며, 일반적으로 2개월이 지나면 비활성화 토큰으로 판단할 것을 제시하고 있다.