[Android] FCM (1) - FCM 이란? / FCM 사용법 / 테스트 메시지 수신
안드로이드에서 흔히 Push 알림이라 불리는 FCM에 대해 알아보고 사용해보자.
참고로, 2024년 6월 20일부로 기존 HTTP 방식의 Cloud Messaging API는 더 이상 사용할 수 없다.
그렇기에 이 포스팅에서는 변경된 HTTP v1 방식을 다룰 것이다.
FCM 이란?
Firebase Cloud Messaging 의 약자이며, 공식 문서에서는 다음과 같이 정의한다.
'메시지를 안정적으로 무료 전송할 수 있는 크로스 플랫폼 메시징 솔루션'
정의에서 알 수 있듯이, 주요 기능은 메시지를 전송하는 역할이다.
또한, 크로스 플랫폼을 지원하기에 안드로이드, ios, 웹에서 모두 이용할 수 있다.
FCM 동작 과정
FCM 구현에는 송수신을 위한 2가지 기본 요소가 갖춰져 있어야 한다.
- 메시지를 작성 · 타겟팅 · 전송할 수 있는 신뢰할 수 있는 환경 (서버)
- 해당 플랫폼별 전송 서비스를 통해 메시지를 수신할 수 있는 앱
쉽게 정리하자면 서버에서 메시지를 전송하고, 앱에서는 메세지를 수신한다고 볼 수 있다.
그리고 그 사이에 Firebase가 존재한다.
이 과정을 조금만 자세히 알아보자.
1. 가장 먼저 외부 요소에서 서버로 어떠한 동작이 일어날 것이다.
여기서 외부 요소라고 표현한 것은 FCM을 사용하는 출발 지점을 알 수 없기 때문이다.
채팅 앱이라고 가정하면 모바일이 출발 지점이 될 수 있고,
사용자가 웹 페이지에서 어떠한 버튼을 클릭했을 때가 될 수도 있다.
사내 프로젝트에서는 IP 카메라가 서버로 FCM을 요청하는 시나리오가 출발점이 되었다.
2. 서버에서는 외부 요소로부터 데이터를 전달 받아서 송신할 데이터로 정제하고,
수신 받을 클라이언트를 지정한 뒤 Firebase에 FCM을 요청한다.
수신 받을 클라이언트는 FCM 토큰으로 식별할 수 있으며,
FCM 요청은 Firebase Cloud Messaging API를 호출하는 행위라고 볼 수 있다.
3. Firebase는 서버로부터 전달받은 데이터를 지정된 클라이언트에게 송신한다.
4. 클라이언트는 FCM을 수신한다.
(언제든 수신할 준비가 되어있어야 한다 == 항상 수신 대기 상태)
하지만 위 과정이 이루어지려면, 서버와 Firebase에서는 FCM 토큰(클라이언트의 식별자)을 알고 있어야한다.
1. Firebase SDK를 앱에 설정한다.
2. Firebase에서 앱에게 식별자를 정해준다.
3. 앱은 서버에게 자신의 식별자를 알려준다.
위 그림 예시에서 표현된 "Oscar123" 이라는 것이 식별자이며, 곧 FCM 토큰이다.
이렇게 FCM 토큰이 한 번 발급된 이후로 Firebase는
해당 토큰으로 '어떤' 앱에 메시지를 Push 할 지 식별하는 것이다.
FCM이 동작하는 과정과 FCM 토큰이라는 식별자까지 이해했다면
이제 FCM을 직접 사용해보자.
Firebase Console 세팅
✅ Firebase Console 계정 생성 · 프로젝트 추가
콘솔 링크 ↓
로그인 - Google 계정
이메일 또는 휴대전화
accounts.google.com
Firebase Console의 계정을 생성하는 방법은 별도로 포스팅하지 않겠다.
하지만 FCM 서비스를 이용하려면 반드시 필요한 과정이기에, 각자 알아서 계정을 생성하기 바란다.
● 계정 생성 후 프로젝트를 추가해준다.
프로젝트 이름 입력 후 애널리틱스 설정해주고 생성해주면 된다.
✅ 앱 등록
● 생성된 프로젝트 내에서 앱을 추가한다.
안드로이드 앱에서 사용할 것이기에 안드로이드 아이콘을 눌러준다.
● 패키지명을 입력해준다. (필수값)
앱 닉네임과 디지털 지문은 선택사항이다.
● google-service.json 파일을 다운로드 후 안드로이드 프로젝트에 추가해준다.
위 스크린샷처럼, 해당 페이지에 자세한 설명이 나와있기에 굳이 설명 안 한다.
3번 째 단계인 Firebase SDK는 Android 쪽 세팅 단계로 볼 수 있으므로,
다음 Android 세팅 탭에서 진행한다.
Android 세팅
✅ Firebase SDK 설정 (build.gradle 세팅)
- build.gradle.kts (프로젝트 수준)
plugins {
...
id("com.google.gms.google-services") version "4.4.2" apply false
}
- build.gradle.kts (앱 모듈 수준)
plugins {
...
id("com.google.gms.google-services")
}
dependencies {
...
implementation(platform("com.google.firebase:firebase-bom:33.3.0"))
implementation("com.google.firebase:firebase-analytics")
implementation("com.google.firebase:firebase-messaging:24.0.1")
}
2개의 build.gradle 파일에 위와 같이 SDK 설정을 해준다.
✅ Manifest 세팅
Firebase와 통신이 이루어져야 하기에 당연히 인터넷 권한을 추가해주고,
사용할 서비스 파일을 추가해준다. (다음 단계에서 생성해줄 서비스 파일이다)
<uses-permission android:name="android.permission.INTERNET"/>
<application>
...
<service
android:name=".service.FCMService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
</application>
✅ Firebase Service 세팅
위 Manifest 파일에 추가해줬던 Service 파일이다.
class FCMService: FirebaseMessagingService() {
// 새로운 FCM 토큰이 발급되었을 때
override fun onNewToken(token: String) {
super.onNewToken(token)
}
// FCM 메시지가 수신되었을 때
override fun onMessageReceived(message: RemoteMessage) {
super.onMessageReceived(message)
}
}
큼직하게 3가지만 기억하면 된다.
1. FirebaseMessagingService를 상속하는 Service를 생성
2. onNewToken() 함수 override
새로운 토큰이 발급되었을 때 해당 함수가 동작한다.
이때 이 토큰을 DB에 저장하는 등의 동작을 구현하면 된다.
3. onMessageReceived() 함수 override
FCM 메시지가 수신되면 해당 함수가 동작한다.
이 곳에서 FCM을 수신하고 그 이후의 동작을 구현해주면 된다.
✅ FCM 토큰 확인 후 저장해놓기
onNewToken() 함수 안에 token 파라미터를 로그로 찍어보면 토큰 값을 확인할 수 있다.
onNewToken() 함수는 토큰이 새롭게 발급될 때 1회만 호출되므로,
혹시나 로그를 못 찍고 앱을 빌드했다면 다른 방법으로 토큰 값을 알아내야 한다.
FirebaseMessaging.getInstance().token.addOnCompleteListener {
Log.d(TAG, "init: ${it.result}")
}
위와 같은 방법으로 FCM 토큰을 다시 확인해볼 수 있다.
MainActivity의 onCreate() 함수 등에 위 리스너를 추가해주고 빌드한 뒤, 토큰을 저장해놓자.
✅ 수신되는 메시지 로그 출력
이제 FCM을 테스트해 볼 것이므로 onMessageReceived() 함수에 로그를 찍어보자.
메시지의 제목과 내용을 확인하는 문법은 다음과 같다.
override fun onMessageReceived(message: RemoteMessage) {
super.onMessageReceived(message)
val title = message.notification?.title
val body = message.notification?.body
Log.d(TAG, "title : $title")
Log.d(TAG, "body : $body")
}
Firebase Console에서 테스트 메시지 송신
✅ Firebase Console의 좌측 탭에서 Messaging 클릭
✅ 첫 번째 캠페인 → 알림 메시지 이동
✅ FCM 토큰 추가 후 테스트
알림 제목 · 내용을 임의의 값으로 작성해주고,
위에서 저장해 두었던 FCM 토큰을 추가한 후 테스트 버튼을 눌러보자.
✅ 결과
onMessageReceived() 함수에 출력해놓았던 로그에 데이터가 출력된 것을 확인할 수 있다.
이번 포스팅에서는 Firebase Console과 앱에서 FCM 수신 대기 상태를 세팅하고,
테스트 메시지를 수신해보았다.
다음 포스팅에서는 테스트 메시지 방식이 아닌, 직접 FCM을 송·수신 해본다.
