Android (안드로이드)

[Android] FCM (1) - FCM 이란? / FCM 사용법 / 테스트 메시지 수신

Oscar:) 2024. 10. 1. 17:16
728x90

 

 

 

안드로이드에서 흔히 Push 알림이라 불리는 FCM에 대해 알아보고 사용해보자.

 

 

 

참고로, 2024년 6월 20일부로 기존 HTTP 방식의 Cloud Messaging API는 더 이상 사용할 수 없다.

그렇기에 이 포스팅에서는 변경된 HTTP v1 방식을 다룰 것이다.

 

 

 


 

FCM 이란?

 

 

출처 : Firebase 공식 문서

 

 

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을 송·수신 해본다.

 

 

 

 

728x90