Firebase에도 AWS의 서버리스 프레임워크처럼, 서버리스를 지원합니다.
그 서비스 이름은 바로 'Cloud Functions' 입니다.
Cloud Functions
Firebase용 Cloud Functions는 Firebase 기능과 HTTPS 요청에 의해 트리거되는 이벤트에 응답하여 백엔드 코드를 자동으로 실행할 수 있는 서버리스 프레임워크입니다.
함수를 작성하고 배포하면 Google 서버에서 즉시 함수를 관리하기 시작합니다. HTTP 요청으로 직접 함수를 실행하거나, 백그라운드 함수의 경우 Google 서버에서 이벤트를 수신대기하고 함수가 트리거되면 실행합니다.
이 서비스를 이용하기 위해서는 기본 요금 서비스로는 이용할 수 없고,
사용량 만큼 지불(Blaze)로 요금제를 업그레이드 하고 나야 이용할 수 있습니다.
하지만 Blaze를 이용한다고 해서, 기존에 이용하던 서비스들이 모두 유료로 전환되는 개념이 아니라
기본 무료 요금제만큼 이용할 수 있되, 기본 무료 요금제의 한도를 넘어갈 때 부터 사용량 당 요금이 부과되는 방식입니다.
즉, 기존 무료 사용량 + 추가 요금 부과 가 Blaze 요금제라고 볼 수 있습니다.
1. Cloud functions 설정
firebase 프로젝트를 연결하기 위한 프로젝트 디렉토리를 생성한 뒤에, 아래 명령어를 입력하여 설정 도구를 받아줍니다.
$ npm install -g firebase-tools
그 다음엔 firebase 프로젝트를 초기화해줍니다.
firebase init
그 다음 필요한 기능들을 space를 이용해서 멀티체크하고
(저같은 경우엔 firestore & cloud functions)
그 이후 프로젝트를 새로 만들어서 할지, 아니면 기존에 있던거로 할지 선택합니다.
만약 다음과 같은 에러가 발생한다면
Error: Failed to list Firebase projects
로그인 인증을 다시 진행해줘야합니다.
firebase login --reauth
기본적인 설정을 완료하고, JavaScript를 이용해서 설정합니다.
2. 함수 작성하기
제가 Cloud Functions를 사용하는 목적은 다음과 같았습니다.
Flutter를 이용하여 Firestore의 문서를 추가하게 되면 해당 문서 주제를 구독하고 있는 유저들에게 FCM을 발송시키고자 하는 목적입니다
Client 단에서는 Firebase-Admin을 사용할 수 없기 때문에, 별도의 서버 없이 간편하게 Cloud Functions를 이용하여 이를 구현하고자 했습니다.
1. 설정
프로젝트 설정 -> 클라우드 메세징에서 Cloud Messaging API가 설정되어 있어야 합니다.
이후 새로운 버전에 대한 마이그레이션 방법은 추가로 글을 작성할 예정입니다.
2. index.js 수정
const functions = require("firebase-functions");
const admin = require("firebase-admin");
admin.initializeApp();
exports.sendFCMOnDocumentAdded = functions.firestore
.document("{collection}/{documentId}")
.onCreate(async (snapshot, context) => {
// 주제 구독 관련 코드 작성하셔야 합니다
// Send the FCM message to the specified topic
try {
await admin.messaging().sendToTopic(topic, payload);
console.log("FCM message sent successfully");
} catch (error) {
console.error("Error sending FCM message:", error);
}
});
코드의 뼈대는 다음과 같습니다. onCreate 함수를 통해 컬렉션에 문서가 추가될 시의 트리거를 달았고
sendToTopic으로 topic에 대해 메세지를 보내줍니다. 이 코드는 뼈대일 뿐 자세한 코드는 입맛대로 작성하시면 됩니다.
3. 배포
콘솔에서 다음 명령어를 입력하여 functions를 배포해주면 됩니다.
firebase deploy
이후 Flutter 클라이언트에서 문서를 추가하면, 주제를 구독하고 있는 유저들에게 모두 FCM이 전송됩니다.
Cloud Functions를 연동하면 굉장히 빠르게 메세지가 수신됩니다~~ (보내고 1초)
새로 나온 버전의 코드로 마이그레이션 하는 방법도 추가로 작성할 예정입니다.
궁금하신 부분은 댓글 남겨주세용
참고
https://firebase.google.com/docs/functions/firestore-events?hl=ko
'[Flutter]' 카테고리의 다른 글
[Flutter] API 캐싱 (Dio & Hive) (0) | 2024.01.22 |
---|---|
[Flutter] showDialog 뒤로가기 (1) | 2023.12.23 |
Flutter에서 sp, dp 사용하기 (1) | 2023.04.21 |
[Flutter] iOS FCM 추가 구현 및 주의 (0) | 2023.04.16 |
Await 실험 (0) | 2023.04.12 |