[JavaScript] Firebase Cloud Functions 연동(3) - DB 조회 후 FCM 알림 전송

구현 목표

지정된 시간마다 자동으로 Firestore에서 데이터를 조회해서

조건을 만족하면 FCM으로 알림을 전송하는 기능을 구현한다.

 

onShedule 예약 함수 작성

// The Cloud Functions for Firebase SDK to create Cloud Functions and triggers.
const { logger, setGlobalOptions } = require("firebase-functions/v2");
const { onSchedule } = require("firebase-functions/v2/scheduler");

// The Firebase Admin SDK to access Firebstore.
const { initializeApp } = require("firebase-admin/app");
const { getFirestore } = require("firebase-admin/firestore");
const { getMessaging } = require("firebase-admin/messaging");

const fetch = require("node-fetch");
const cheerio = require("cheerio");

initializeApp();
setGlobalOptions({
  region: "asia-northeast3",
}); 

// FCM 알림 전송 함수
async function sendNotification(title, body, link) {
  const message = {
    notification: {
      title,
      body,
    },
    topic: "all",
    ...(link && { data: { link } }),
  };
  try {
    const response = await getMessaging().send(message);
    logger.log("✅ FCM 알림 전송 성공", { response });
  } catch (error) {
    logger.error("❌ FCM 알림 전송 실패", { error: error.message });
  }
}

// 포인트를 사용하라고 알림을 보내는 예약 함수
exports.sendPointUseReminder = onSchedule(
  {
    schedule: "0 22 * * 1-5", // 평일 22:00
    timeZone: "Asia/Seoul",
  },
  async (event) => {
    const dateStr = getTodayString(); // 예: 2025-08-01

    try {
      const doc = await getFirestore()
        .collection("pointDays")
        .doc(dateStr)
        .get();

      if (doc.exists) {
        const data = doc.data();
        if (data.link) {
          await sendNotification(
            "포인트 사용하셨나요?",
            "오늘 받은 포인트는 자정이 지나면 사라집니다. 지금 바로 사용하세요!",
            "https://ridibooks.com/"
          );
          logger.log("✅ 포인트 사용 알림 전송 완료", {
            date: dateStr,
          });
        }
      } else {
        logger.log(
          "❌ 오늘 날짜 문서가 없어 포인트 사용 알림을 보내지 않습니다.",
          {
            date: dateStr,
          }
        );
      }
    } catch (error) {
      logger.error("❌ sendBPointUseReminder 함수 실행 중 오류", {
        error: error.message,
      });
    }
  }
);
  • 매일 평일 22시마다 예약 함수가 실행된다.
  • Firestore의 `pointDays` 컬렉션에서 오늘 날짜의 문서를 조회한다.
  • 해당 문서가 존재한다면, FCM으로 알림을 전송한다.
  • 문서가 없으면 알림은 보내지 않는다.

 

Firebase Cloud Functions 연동 시리즈