FCM(Firebase Cloud Messaging)은 푸시 알림 전송과 서버와 모바일 애플리케이션 간의 데이터 전송을 위한 Google의 크로스 플랫폼 서비스입니다. 단일 API를 통해 Android, iOS 및 웹 플랫폼을 지원합니다. Firebase 문서에 따르면, FCM은 전 세계적으로 매일 10억 개 이상의 메시지를 처리합니다.
핵심 사항
Firebase Cloud Messaging(FCM)은 모바일 기기에 푸시 알림 및 데이터 메시지를 안정적으로 전송하는 Google의 클라우드 서비스입니다. 이전에 Google Cloud Messaging(GCM)으로 알려졌던 FCM은 Firebase 생태계에서 크로스 플랫폼 알림의 주요 도구가 되었습니다.
FCM은 플랫폼에 따라 최적의 전송 채널을 자동으로 선택합니다. Android에서는 자체 FCM 연결을 사용하고, iOS에서는 APNS(FCM 게이트웨이를 통해)를 사용합니다. 개발자가 두 가지 다른 통합을 구현할 필요가 없습니다 — FCM이 라우팅을 처리합니다.
이 서비스는 메시지 전송을 위한 통합 REST API 및 Admin SDK를 제공합니다. 이를 통해 특정 수신자 플랫폼에 얽매이지 않고 서버 측에서 알림을 보낼 수 있습니다.
FCM은 여러 전송 모드를 지원합니다: 특정 기기에 단일 메시지, 주제별 그룹 전송, 조건별 세그먼트 전송. 예약 전송 및 알림 콘텐츠의 A/B 테스트도 가능합니다.
FCM 아키텍처는 클라이언트 애플리케이션, Firebase Connection Server, 앱 서버의 세 가지 구성 요소를 기반으로 합니다. 클라이언트는 시작 시 FCM에 등록하고 고유한 등록 토큰을 받습니다 — 이는 특정 애플리케이션의 기기를 식별하는 문자열입니다.
앱 서버는 수신자 토큰 또는 주제를 지정하여 FCM REST API에 요청을 보냅니다. Firebase Connection Server는 지속적인 XMPP 연결 또는 HTTP 요청을 사용하여 메시지를 전송합니다. 기기가 오프라인 상태인 경우 메시지는 대기열에 추가되었다가 연결이 복원될 때 전송됩니다.
FCM은 우선순위 대기열 및 확인 메커니즘을 사용하여 전송을 보장합니다. Android에서는 메시지가 대기열에 최대 28일 동안 저장되고, iOS에서는 최대 4주(APNS를 통해) 동안 저장됩니다. 만료일 이후에는 메시지가 알림 없이 삭제됩니다.
등록 토큰은 여러 경우에 변경될 수 있습니다: 앱 데이터 복원 시, 새 버전으로 업데이트 시, 캐시 지우기 시. 앱은 토큰 업데이트를 처리하고 서버와 동기화하기 위해 FirebaseMessagingService.onNewToken을 구현해야 합니다.
FCM은 notification과 data의 두 가지 페이로드 유형을 지원합니다. 각 유형은 수신자 기기에서 메시지가 처리되는 방식과 시기를 결정합니다.
| 매개변수 | Notification | Data |
|---|---|---|
| 자동 표시 | 예(앱이 백그라운드인 경우) | 아니요(앱 내에서만) |
| 처리 | 시스템/NOS — 백그라운드; 앱 — 포그라운드 | 항상 앱 내(onMessageReceived) |
| 최대 크기 | 4 KB | 4 KB |
| 사용자 정의 키 | 미리 정의된 필드로 제한 | 모든 키-값 쌍 |
| CollapseKey 필요 | 선택 사항 | 그룹화를 위한 선택 사항 |
실제로는 앱이 onMessageReceived에서 완전한 알림 처리가 필요한 경우 data 메시지를 사용하는 것이 좋습니다. Notification 메시지는 시스템 표시로 충분한 간단한 시나리오에 적합합니다.
FCM과 APNS는 두 가지 주요 푸시 전송 서비스입니다. FCM은 크로스 플랫폼 게이트웨이로 작동하는 반면, APNS는 Apple 생태계 전용입니다. 주요 차이점은 아키텍처, 인증서 요구 사항 및 라우팅 메커니즘에 있습니다.
FCM과 직접 APNS 중 선택은 프로젝트 아키텍처에 따라 다릅니다. 크로스 플랫폼 애플리케이션의 경우 FCM이 최적의 선택입니다. iOS 전용 프로젝트의 경우 HTTP/2 API를 통한 직접 APNS 작업이 허용됩니다.
FCM은 프로젝트가 Android와 iOS를 동시에 사용하는 경우, 그리고 Firebase 분석, 알림 A/B 테스트 또는 서버 로직 없이 주제가 필요한 경우 적합합니다. 직접 APNS는 최소한의 종속성과 엄격한 전송 지연 시간 요구 사항이 있는 iOS 전용 애플리케이션에 선호됩니다.
Android 애플리케이션에 FCM을 연결하려면 Firebase SDK를 추가하고 프로젝트 루트에 google-services.json을 구성해야 합니다. 토큰 등록 후 애플리케이션은 FirebaseMessagingService를 통해 메시지를 받을 준비가 됩니다.
// build.gradle (Module)
dependencies {
implementation("com.google.firebase:firebase-messaging:24.1.0")
}
// AndroidManifest.xml
<service android:name=".MyFirebaseMessagingService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
class MyFirebaseMessagingService :
FirebaseMessagingService() {
override fun onNewToken(token: String) {
sendTokenToServer(token)
}
override fun onMessageReceived(message: RemoteMessage) {
message.notification?.let {
showNotification(it.title, it.body)
}
}
}
설정 후 애플리케이션은 첫 실행 시 자동으로 FCM 토큰을 받습니다. 이 기기에 대한 후속 알림 전송을 위해 토큰을 앱 서버로 보내야 합니다.
Android 8+에서는 자동 표시가 있는 FCM 알림을 보내기 전에 NotificationChannel을 만들어야 합니다. FCM notification 메시지는 기본 채널 ID를 사용하지만, 첫 번째 메시지를 받을 때 FirebaseMessagingService를 통해 사용자 정의 채널을 만드는 것이 좋습니다. Data 메시지는 채널이 필요하지 않습니다 — 앱이 자체적으로 알림을 표시할 방법과 시기를 결정합니다.
iOS에서 FCM은 앱 서버와 APNS 사이의 중개자 역할을 합니다. Firebase는 서버에서 메시지를 받아 APNS 형식으로 래핑하고 Apple 게이트웨이를 통해 전송합니다. 개발자는 Firebase 콘솔에서 APNS 키 또는 인증서를 구성해야 합니다.
import FirebaseMessaging
import UserNotifications
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions options: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
FirebaseApp.configure()
UNUserNotificationCenter.current().delegate = self
Messaging.messaging().delegate = self
return true
}
}
extension AppDelegate: MessagingDelegate {
func messaging(
_ messaging: Messaging,
didReceiveRegistrationToken fcmToken: String?
) {
UserDefaults.standard.set(fcmToken, forKey: "fcm_token")
}
}
iOS에서 APNS 등록은 비동기적으로 이루어집니다. FCM SDK는 자동으로 APNS 토큰을 가져와 Firebase 서버로 전달합니다. didReceiveRegistrationToken은 APNS 토큰과 프로젝트 식별자를 결합한 새 FCM 토큰을 받을 때 실행됩니다.
FCM은 전송 모니터링을 위한 Firebase 콘솔을 제공합니다: 전송, 수신 및 표시된 알림 수. 서버 측 전송 오류를 추적하기 위해 Firebase Cloud Functions를 통한 상태 콜백도 사용할 수 있습니다. 주요 지표: 알림 노출 수 및 열기 수.
FCM으로 작업할 때 각 시나리오에 맞는 올바른 메시지 유형을 선택하는 것이 중요합니다. 자동 표시가 있는 간단한 알림에는 notification 메시지를 사용하세요. 앱이 표시 전에 데이터를 처리해야 하는 경우 data 메시지를 사용하세요. 혼합 유형(notification + data)은 알림 콘텐츠를 변경하기 위한 것이 아니라 분석을 위해 데이터가 필요한 경우에만 권장됩니다.
토큰을 중앙에서 관리하세요. 현재 토큰을 사용자 및 플랫폼에 연결된 테이블로 서버에 저장하세요. 오래된 토큰 정리 메커니즘을 구현하세요: NotRegistered 또는 InvalidRegistration 오류가 발생하면 데이터베이스에서 토큰을 삭제합니다. 토큰은 거의 변경되지 않지만 정리는 FCM 지원의 필수 요소입니다.
메시지 그룹화를 위해 축소 키(collapseKey)를 사용하세요. 동일한 유형의 여러 알림을 보내는 경우(예: "환율 업데이트"), 동일한 collapseKey를 설정하세요. FCM은 그룹의 마지막 메시지만 전송하여 기기 부하를 줄이고 사용자에게 알림이 과도하게 가지 않도록 합니다.
Firebase Console 및 Cloud Functions를 통해 전송을 모니터링하세요. FCM 분석은 전송, 수신 및 표시된 알림 수를 보여줍니다. 표시율이 70% 미만인 경우 Android의 채널 설정과 iOS의 권한 설정을 확인하세요. 낮은 전송률은 종종 비활성화된 채널이나 알림 금지와 관련이 있습니다. 다섯째: Firebase A/B 테스트를 사용하여 알림 텍스트와 전송 시간을 최적화하세요 — Firebase 데이터에 따르면 이를 통해 열기 전환율이 15~25% 향상됩니다.
자주 묻는 질문
FCM은 GCM(Google Cloud Messaging)의 진화된 업데이트입니다. FCM은 Firebase Console을 통한 간소화된 설정, 내장 분석, 주제 및 Web Push 지원을 제공합니다. GCM은 2019년 4월에 공식적으로 중단되었으며, 모든 프로젝트는 FCM으로 마이그레이션해야 합니다.
Firebase Cloud Messaging은 무료 서비스로 메시지 수에 제한이 없습니다. Cloud Functions 또는 Firestore와 같은 다른 Firebase 서비스 사용에 대해서만 요금이 부과됩니다. 기본 알림 전송에 FCM은 Spark 또는 Blaze 구독이 필요하지 않습니다.
FCM 토큰은 다음과 같은 경우에 변경됩니다: 백업에서 앱 복원, 앱 데이터 지우기, 재설치, Sender ID가 변경된 새 버전으로 업데이트. 새 토큰을 서버로 보내려면 FirebaseMessagingService에서 항상 onNewToken을 처리하세요.
Google FCM은 중국에서 차단되었습니다. 중국에서 알림 전송을 위해 Huawei Push Kit, MiPush(Xiaomi), Oppo Push, Vivo Push와 같은 대체 서비스가 사용됩니다. 크로스 플랫폼 전송을 위해 Getui와 같은 다중 제공업체 서비스가 사용됩니다.
내장된 Firebase 콘솔을 사용하세요: "Cloud Messaging" — "Send Test Message"를 선택합니다. 테스트 토큰을 입력하고 notification 메시지를 보냅니다. 기기에 알림이 표시되어야 합니다. FirebaseMessagingService.onMessageReceived 로그도 모니터링할 수 있습니다.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.