작성 배경 및 목적
앱 개발을 하며, 빼놓을 수 없는 것중 하나가 유저에게 알림 메시지를 보내는 것이다. 특히 다른 사람의 활동에 영향을 받는 유저간 커뮤니케이션이 가능한 앱의 경우에는 알림 기능이 사실상 앱의 목적상 필수적으로 들어가야 하는데, 규모가 큰 경우에는 어떤지는 모르겠으나, 소규모의 앱을 개발하면서 FCM이 가장 간편하고 합리적이라는 판단에 의해서 많이 사용하였었다.
현재까지는 단순히 구현에 급급했었기에 이번 기회에 FCM에 대해 기초 개념과 구조부터 차근차근 알아보고자 한다.
FCM의 경우 개인적으로 공식문서가 잘 되어있다고 생각하기 때문에 이를 바탕으로 정리 할 예정이다.
(공식문서 번역은 Cloud Translation API에 의해 번역되었다고 하는데, 개인적으로 영어 문서를 보는 것을 추천한다..)
FCM Architecture
FCM은 작성, 전송 및 수신에 4개의 Component set에 의존한다.
FCM 구성 요소
1. 메시지 Request를 Build하거나, 구성하는 툴을 의미한다.
Notification Console GUI
는 GUI를 기반으로 Notification Request Creating 옵션을 사용할 수 있도록 한다.
추후 나오겠지만, 메시지 타입은 2가지 인데 모든 메시지 타입에 대한 Full-Automation과 Support를 위해선 신뢰할 수 있는 서버 환경(Trusted Server Environment
)내에서 메시지 Request를 Build해야한다.
- Trusted Server Environment
신뢰할 수 있는 서버 환경은, Firebase Admin SDK 또는 FCM Server Protocols를 의미하며, 이 환경은 Firebase용 Cloud Functions, App 엔진 또는 앱 서버 자체일 수 있다.
→ 2가지 방법으로 Notification을 보낼 수 있음을 의미한다.
2. FCM Backend는 다른 Function들 중, 메시지 Request를 허용하고, Topic을 통한 메시지의 Fanout을 실행하며 메시지 ID와 같은 메시지 메타데이터를 생성한다.
3. 메시지를 목표기기에 라우팅하는 Platform-level Transport Layer는 메시지 전송을 핸들링하고, 적절한 경우에 Platform-Specific Configuration을 적용한다. 해당 전송계층을 다음을 포함한다.
1. Android (With Google Play Service)
: ATL (Android Transport Layer)
2. Apple
: APNs (Apple Push Notification services)
3. WebApp
: Web Push Protocol
4. 알림이 표시되거나 메시지가 앱의 Foreground/Background 상태및 관련 앱 로직에 따라 처리되는 유저 기기의 FCM SDK
FCM Lifecycle Flow
1. FCM에서 메시지를 수신할 기기 등록
클라이언트 앱의 Instance
가 메시지를 수신하도록 등록해 앱 인스턴스를 고유하게 식별하는 Registartion Token
을 얻는다.
2. Downstream 메시지를 보내고 받음
메시지를 보내는 경우, 앱 서버는 다음과 같이 클라이언트 앱에 메시지를 보낸다.
1. Notification Composer
나 Trusted Environment
에서 메시지가 작성되고, 해당 메시지 Request가 FCM Backend로 보내진다.
2. FCM Backend
가 메시지 Request를 받아, 메시지 ID를 포함한 다른 메타데이터를 만들고, 이를 플랫폼 별 전송 계층으로 보낸다.
3. 기기가 온라인인 경우, 플랫폼 별 전송계층을 통해 메시지가 기기로 전송된다.
4. 기기에서 클라이언트 앱은 메시지 또는 알림을 받는다.
앱 서버를 이용해 메시지를 보내는 과정
자체 앱 서버가 있는 경우에 FCM를 보내는 과정은 대략적으로 5개 단계로 나누어 볼 수 있다.
1. Token 요청 및 획득
사용자가 앱을 설치하고, 최초 실행시, Token을 얻기위해 Firebase Cloud 서버에 요청을 보내 Token을 획득한다.
2. 서버에 Token 저장
획득한 Token을 서버로 전송해, 서버 DB에 저장한다. 이 Token은 서버가 Firease Cloud에 메시지 전송을 요청할 때 어디로 보내는 지 구분하기 위한 용도로 사용된다.
3. 서버에 저장된 Token을 활용해 메시지 전송 요청
서버에서 Firebase Cloud로 Message와 함께 Token을 보내 메시지 전송을 요청한다.
4. 메시지 전송
Firebase Cloud는 요청받은 메시지를 Token에 해당하는 기기에 전송한다
5. Listener를 통해 전송된 메시지 수신
앱이 실행중이 아니더라도 Listener를 통해 Firebase Cloud로부터 알림 메시지를 수신한다
FCM Messages Type
FCM은 광범위한 Messaging Option과 기능을 제공한다. 이에 따라, FCM을 사용하면 2가지 유형의 메시지를 클라이언트에 보낼 수 있다.
2가지 유형 모두 최대 Payload는 4,000 Byte이며, Firebase 콘솔에서 보내는 경우엔 1024글자로 제한된다.
Message Type 특징 구분
1. Notification Message (Display Message)
핸들링 주체
: FCM SDKKey-Value
: 미리 정의된 Set of User-Visible Key가 존재함- Optional로
Data payload
를 포함시킬 수 있음 - → 이 경우,
notification payload
는FCM SDK
가 처리하고,data payload
는클라이언트 앱
이 처리한다.
2. Data Message
핸들링 주체
: 클라이언트 앱Key-Value
: User-defined 커스텀 key-value 쌍만을 포함
→ FCM이 클라이언트 앱을 대신해 알림 표시를 처리하도록 하려면 Notification Message
를
클라이언트 앱이 메시지를 처리하려는 경우에는 Data Message
를 사용한다.
Notification Message
사용 목적
테스트/마케팅 및 사용자 재참여를 위해 Firebase 콘솔을 통해 Notification Message를 보낼 수 있다. 특히, Firebase 콘솔을 분석 기반 A/B 테스트를 제공하기 때문에, 마케팅 메시지를 구체화하고 개선하는데 도움된다고 한다.
작성 방법
Admin SDK 또는 FCM Protocol를 사용해 프로그래밍 방식으로 Notification Message를 보내기 위해선, 사용자에게 표시되는 부분에 필요한 pre-defined key-value option set
으로 notification
key를 설정해 Notification Message를 구성해야 한다
작성 예시
{
"message":{
"token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
"notification":{
"title":"Portugal vs. Denmark",
"body":"great match!"
}
}
}
위와 같은 코드를 통해, 유저는 “Portugal vs Denmark”라는 제목과, “great match!”라는 텍스트가 있는 메시지를 볼 수 있다.
How To Send
Notification Message
는 보내는 방법이 2가지이다.
1. Notification Composer를 활용한다.
Firebase 콘솔에서 보내는 방법으로, 메시지의 Text, Title 등을 입력하고 전송할 수 있으며, 커스텀 데이터를 제공함으로써 Optional Data payload도 추가도 가능하다.
2. Clous Functions이나 자체 앱 서버와 같은 Trusted Environment에서 Admin SDK나 FCM Server Protocols를 사용한다.
notification
key를 설정해 보낼 수 있다. data
key를 설정해 Optional Data payload도 보낼 수 있으며, 항상 Collapsible하다. (collapsible
과 non-collapsible
의 차이는 아래에서 서술할 예정)
Optional Payload가 있는 Notification Message
How To send
Optional Payload가 없을 때와 동일하게, 프로그래밍 방식/Firebase 콘솔을 통해, 커스텀 key-value 쌍의 optional payload가 포함된 notification message를 보낼 수 있다.
Notification Composer(Firebase 콘솔) 에서는 Advanced option의 custom data fields
를 사용하면 된다.
다음과 같은 예시가 notification
키와, data
키를 모두 포함하는 예시이다.
Optional Payload가 있는 Notification Message 예시
{
"message":{
"token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
"notification":{
"title":"Portugal vs. Denmark",
"body":"great match!"
},
"data" : {
"Nick" : "Mario",
"Room" : "PortugalVSDenmark"
}
}
}
Data Message
작성 방법
user-defined custom key-value
쌍으로 적절한 키를 설정해, 클라이언트 앱에 데이터 페이로드를 보낸다
(이때, 예약어를 사용해서는 안된다. “from”
, “notification”
, “message_type”
과 “google”
, “gcm”
으로 시작되는 모든 단어가 이에 포함된다)
작성 예시
{
"message":{
"token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
"data":{
"Nick" : "Mario",
"body" : "great match!",
"Room" : "PortugalVSDenmark"
}
}
}
Notification Message
와 동일한 예시로, 여기에서는 정보가 data key에 캡슐화되고, 클라이언트 앱이 이를 해석하게 된다.
해당 예시는 메시지를 수신하는 모든 플랫폼의 클라이언트가 해석하는 최상위 수준 또는 공통 data 필드의 사용을 보여주며, 각 플랫폼에서 클라이언트 앱은 Callback함수에서 data payload
를 수신한다.
→ 추후 나오겠지만, 모든 플랫폼에 공통적으로 보내는 것과 플랫폼 별로 다르게 보내는 것이 존재한다.
How To Send
Data Message
는 1가지이다.
1. Clous Functions이나 자체 앱 서버와 같은 Trusted Environment에서 Admin SDK나 FCM Server Protocols를 사용한다.
data
key만을 설정해 보낼 수 있다. 만약, data
key가 아닌 notification
key가 포함될 경우, 이는 Optional Data Payload
를 가진 Notification
Key로 취급하는 듯하다.
Data Message 암호화
ATL
(Android Transport Layer)은 지점간 암호화를 사용한다. 필요에 따라, 데이터 메시지에 종단간 암호화를 추가하도록 결정할수 도 있다. FCM은 end-to-end solution을 제공하지는 않으나, Capillary나 DTLS와 같은 외부 solution을 사용해 구현할 수 있다.
'IT > Android' 카테고리의 다른 글
[Android/FCM] (3) Registration Token 관리 (0) | 2023.03.02 |
---|---|
[Android/FCM] (2) 플랫폼 별 차이와 Delivery Options알림 (0) | 2023.03.01 |
[Android/Retrofit] Effective Error Handling을 위한 CallAdapter의 활용 (0) | 2023.01.25 |
[Android Dev] RecyclerView의 스크롤 상태 체크 (0) | 2023.01.22 |
[Android Env]Keystore 비밀번호를 잊어버렸을 때 (2) | 2023.01.21 |