FCM_알림_구현_관련_시도 - boostcampwm-2024/and04-Nature-Album GitHub Wiki

💡 FCM 알림에서 Notification과 Data의 차이

FCM을 사용할 때, NotificationData는 각각 다른 용도로 사용된다. 이를 이해하고 적절히 활용하는 것이 중요하다.

1. Notification 메시지

  • 목적: 사용자에게 보여지는 알림을 처리하는 데 사용된다.
  • 자동 처리: notification 메시지는 시스템에 의해 자동으로 처리된다. 즉, 앱이 백그라운드종료 상태에 있을 때도, 시스템은 알림을 화면에 표시한다. 사용자가 알림을 클릭하면 앱을 실행할 수 있다.
  • 형식: 주로 알림의 제목(title), 본문(body) 등의 정보를 포함한다.

2. Data 메시지

  • 목적: 앱 내부에서 데이터를 처리할 때 사용된다. data 메시지는 앱에서 직접 처리해야 하므로, 백그라운드에서도 데이터를 처리할 수 있다.
  • 자동 처리 없음: data 메시지는 시스템에서 알림을 자동으로 표시하지 않으며, 개발자가 직접 처리해야 한다. 예를 들어, 앱이 백그라운드에 있을 때 알림 없이 데이터를 수신하거나, 앱 내 로직을 수행하는 데 사용된다.
  • 형식: key-value 쌍의 데이터를 포함하며, 예를 들어 { "senderUid": "user123", "message": "친구 요청이 도착했습니다." }와 같은 형식이다.

차이점 요약

항목 Notification Data
목적 사용자에게 알림 표시 앱 내 데이터 처리
자동 처리 시스템이 알림을 자동으로 표시 개발자가 직접 처리해야 함
상태 백그라운드/포그라운드에서 자동 표시 앱이 백그라운드일 때 알림 없이 데이터 처리
형식 제목, 본문 key-value 쌍의 데이터

💡 Topic 구독 vs FCM 토큰을 사용한 알림 발송

  • Topic 구독을 사용하는 경우, 사용자가 특정 토픽을 구독하고, 해당 토픽에 메시지를 발송하는 방식이다. FCM 토큰을 사용하면, 특정 사용자에게 직접 푸시 알림을 보낼 수 있다.
  • FCM 토큰을 사용하면 개별 사용자를 지정할 수 있으며, 토픽 구독 없이 특정 사용자에게만 알림을 보낼 수 있다.

FCM 토큰을 사용하는 이유

  • 개별 사용자 알림: 토픽에 구독할 필요 없이 특정 사용자의 기기에 직접 푸시 알림을 보내기 위해 FCM 토큰을 사용할 수 있다.
  • 구독 필요 없음: 특정 사용자의 FCM 토큰을 알게 되면, 그 사용자에게 직접 푸시 알림을 보낼 수 있으므로 토픽 구독을 설정할 필요가 없다.

💡 FCM Token을 사용하는 친구 요청 알림 예시

FCM을 사용하여 친구 요청 알림을 특정 사용자에게 보내는 방식은 FCM 토큰을 사용하여 알림을 전송하는 것이다. 여기서 중요한 점은 토픽 구독이 필요 없다는 것이다. 친구 요청을 받은 사용자에게는 해당 사용자의 FCM 토큰을 사용해 직접 알림을 보내면 된다.

💡 구현 예시: FCM 토큰을 사용하여 친구 요청 알림 보내기

const functions = require("firebase-functions");
const admin = require("firebase-admin");

// Firebase Admin 초기화 admin.initializeApp();

// 친구 요청 문서 생성 시 트리거 exports.onFriendRequestCreated = functions.firestore .document("USER/{uid}/FRIEND_REQUESTS/{requestUid}") .onCreate(async (snapshot, context) => { const newRequest = snapshot.data(); // 새로 생성된 문서 데이터 const uid = context.params.uid; // 요청을 받은 사용자 ID

// 데이터 확인
if (!newRequest) {
  console.log("No snapshot available.");
  return;
}

// 요청 상태가 "RECEIVED"인 경우만 처리
if (newRequest?.status === "RECEIVED") {
  console.log(`Friend request RECEIVED by user: ${uid}`);

  try {
    // Firestore에서 요청 받은 사용자의 FCM 토큰 가져오기
    const userDoc = await admin.firestore().collection("USER").doc(uid).get();
    const userData = userDoc.data();
    const fcmToken = userData?.fcmToken;

    if (!fcmToken) {
      console.log(`No FCM token found for user: ${uid}`);
      return;
    }

    // 요청을 보낸 사용자 정보 가져오기
    const sender = newRequest.user; // 요청 보낸 사용자 정보
    const senderDisplayName = sender?.displayName || "알 수 없는 사용자";

    // FCM 알림 메시지 생성
    const message = {
      token: fcmToken,  // FCM 토큰을 통해 푸시 알림 전송
      notification: {
        title: "새로운 친구 요청",
        body: `${senderDisplayName}님으로부터 친구 요청이 도착했습니다.`,
      },
    };

    // FCM 메시지 전송
    await admin.messaging().send(message);
    console.log(`Notification sent to user: ${uid}`);
  } catch (error) {
    console.error("Error sending notification:", error);
  }
} else {
  console.log("Friend request not in RECEIVED state, skipping notification.");
}

});

✅ 결과 확인

  • FCM 토큰을 사용하여 특정 사용자에게 친구 요청 알림을 보내는 데 성공했다.
  • 토픽 구독 없이 FCM 토큰을 사용하여 알림을 보낼 수 있음을 확인했다.

💡 결론

  • FCM 토큰을 사용하여 친구 요청 알림을 특정 사용자에게 직접 보낼 수 있다.
  • Topic 구독을 사용하지 않고, FCM 토큰만으로도 특정 사용자에게 푸시 알림을 보낼 수 있기 때문에, 개별 사용자에게 알림을 보내는 데 매우 효율적이다.
  • Firebase Cloud Functions를 활용한 푸시 알림 시스템을 구축하면, Firestore 트리거FCM을 연동하여 실시간 알림을 자동으로 전송할 수 있다.
⚠️ **GitHub.com Fallback** ⚠️