구현 목표
지정된 시간마다 자동으로 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 연동 시리즈
- [JavaScript] Firebase Cloud Functions 연동(1) - 기본 함수 테스트
- [JavaScript] Firebase Cloud Functions 연동(2) - 지정된 시간마다 호출되는 함수