본문 바로가기
Android

[Android] 하나의 앱에서 다중 FirebaseMessagingService 구성 가능 여부

by JongSeok 2025. 3. 9.

배경

회사에서 서비스를 개발하면서 문득 아래와 같은 의문이 들었습니다.

안드로이드 프로젝트에는 FCM 메시지를 수신하는 FirebaseMessagingService()를 상속받는 클래스를 정의할 수 있는데 그렇다면 FirebaseMessaingService를 상속받는 다수의 클래스를 정의해 다른 Firebase 프로젝트에서 전송하는 FCM 메시지를 각각 다른 FirebaseMessagingService에서 수신해서 적절히 핸들링할 수 있을까?

 

위 의문에 대해 개인적인 결론을 내려보았습니다.


우선, 기본적으로 하나의 어플리케이션 다수의 Firebase 프로젝트 사용 가능하고, 컴파일 과정 전 Application 클래스에서 초기화됩니다.

// 어플리케이션에 하나의 Firebase 프로젝트를 사용하는 경우
FirebaseApp.initializeApp(this)    

// 어플리케이션에 다수의 Firebase 프로젝트를 사용하는 경우 
val firebaseOptionsA = FirebaseOptions.Builder()
    .setApiKey("API_KEY")   
    .setApplicationId("APPLICATION_ID")    
    .setProjectId("PROJECT_ID")
    .build()

val firebaseOptionsB = FirebaseOptions.Builder()
    .setApiKey("API_KEY")
    .setApplicationId("APPLICATION_ID")    
    .setProjectId("PROJECT_ID")
    .build()

FirebaseApp.initializeApp(this, firebaseOptionsA, "FirebaseAppA")
FirebaseApp.initializeApp(this, firebaseOptionsB, "FirebaseAppB")

참고로 초기화된 Firebase의 PushToken은 FirebaseApp 객체마다 할당되기 때문에 두 Firebase 프로젝트에서 사용되는 PushToken은 동일하지 않습니다.

 

위로 부터 초기화된 각각의 Firebase 프로젝트에서 발송하는 FCM 메시지를 FirebaseMessagingServiceA, FirebaseMessagingServiceB 로 구분해 수신하고 싶었지만, 전송된 Firebase 프로젝트에 관계 없이 앱에서는 하나의 FirebaseMessagingService 클래스에서만 FCM 메세지를 수신합니다.
(다수의 FirebaseMessagingService 클래스가 존재할 수는 있지만 하나의 FirebaseMessagingService에서만 수신하기 떄문에 의미가 없습니다.)


그렇다면 다수의 Firebase 프로젝트에서 전송하는 FCM 메세지를 구분할 수 있는 방법은 없을까요?

 

제가 대안으로 생각한 방법은 다음과 같습니다.

대안 1

FirebaseMessagingService()에서 FCM 메시지를 수신하는 fun onMessageReceived(message: RemoteMessage) {…} 메소드의 RemoteMessage 객체에는 발송된 Firebase 프로젝트에 대한 정보를 포함하고 있습니다.

FirebaseMessagingService 클래스에서 RemoteMessage 객체에 담긴 from 속성을 활용해 어느 Firebase 프로젝트에서 전송된 FCM 메시지인지 구분합니다.

override fun onMessageReceived(message: RemoteMessage) {
    super.onMessageReceived(message)

    if (message.from == "663009783750") {
        // FirebaseA에서 발송된 FCM
    } else if (message.from == "322841705294") {
        // FirebaseB에서 발송된 FCM
    }
    
    ...
}

 

대안 2

FirstFirebaseMessagingService를 상속받는 SecondFirebaseMessagingService 생성합니다.

open class FirstFirebaseMessagingService: FirebaseMessagingService() {...}
class SecondFirebaseMessagingService: FirstFirebaseMessagingService() {...}

 

그리고 FirstFirebaseMessagingService에서 FCM 메세지 수신 시 모든 FCM 메세지를 SecondFirebaseMessagingService로 전달할 수 있도록 메소드를 오버라이딩합니다.

open class FirstFirebaseMessagingService: FirebaseMessagingService() {
    open fun sendFCM(message: RemoteMessage) {
        // RemoteMessage 전달
    }

    override fun onMessageReceived(message: RemoteMessage) {
        super.onMessageReceived(message)
        sendFCM(message)

        ...
    }
}

class SecondFirebaseMessagingService: FirstFirebaseMessagingService() {
    override fun sendFCM(message: RemoteMessage) {
        // RemoteMessage 수신
        ...
    }
}

 

 

 

참고자료. https://firebase.google.com/docs/projects/multiprojects?hl=ko#kotlin

 

 

여러 프로젝트 구성  |  Firebase

의견 보내기 여러 프로젝트 구성 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 이 페이지에서는 앱에서 둘 이상의 Firebase 프로젝트를 사용하는 방법을 설

firebase.google.com

 

728x90
반응형