-
[Firebase] Functions λ‘ μ¬μ©μ μμ μ λ°μ΄ν° μμ ꡬνPROGRAMMING/κΈ°ν 2022. 1. 20. 13:50
μ΄λ²μλ Firebase Functions λ₯Ό μ΄μ©ν΄μ μ¬μ©μλ₯Ό μμ νλ©΄ κ·Έ μ¬μ©μμ κ΄λ ¨λ λ°μ΄ν°λ μμ νλλ‘ ν΄λ³΄κ² μ΅λλ€.
firestore, storage λ₯Ό μ¬μ©νκΈ° λλ¬Έμ μ΄ λμ νκ²μΌλ‘ νμ¬ μ¬μ©μ μμ μ νΈλ¦¬κ±°λ functions λ₯Ό μμ±νλ©΄ λ©λλ€.
* λͺ¨λ λ΄μ©μ functions/index.js μμ μμ±νμ΅λλ€.
* cloud functions μ€μ μ μ΄μ ν¬μ€ν μ μμ΅λλ€.
1) firebase μ€μ
functions μ firebase λ₯Ό λ€μκ³Ό κ°μ΄ μ€μ ν΄μ€λλ€.
const functions = require("firebase-functions"); // The Firebase Admin SDK to access Firestore. const admin = require("firebase-admin"); admin.initializeApp({ storageBucket: "APP_ID.appspot.com", });
μ λ initializeApp μ storageBucket μΌλ‘ bucket μ μ§μ ν΄μ£Όμμ΅λλ€.
(μ΄λ μ΄νμ μ§μ ν μλ μμ΅λλ€. μ λ storage μμ 1κ°μ bucket λ§ μ¬μ©ν΄μ μ΄λ κ² νμ΅λλ€.)
2) user μμ μ μ€νν functions μμ±
exports.clearData = functions .region("asia-northeast2") .auth.user().onDelete((event) => { const uid = event.uid; const promises = clearFirebaseData(uid); return Promise.all(promises) .then(() => console.log(`Successfully removed data for user #${uid}.`)); });
user κ° delete λ λ μ€ννλλ‘ νμκ³ , λ°μν event μμ uid λ₯Ό κ°μ Έμ μ€μ λ‘ μμ λ₯Ό ν΄μ£Όλ ν¨μ clearFirebaseData μ λ겨주λλ‘ νμ΅λλ€.
clearFirebaseDate λ λ€μκ³Ό κ°μ΄, νλ‘μ νΈ κ΅¬μ‘°μ λ§κ² μμ λ‘μ§μ μμ±ν΄μ£Όλ©΄ λ©λλ€.
μ μ κ²½μ° COLLECTION/uid μ κ²½λ‘μ ν΄λΉ μ¬μ©μμ λ°μ΄ν°λ₯Ό μ μ₯νκ³ μμ΄μ, λ€μκ³Ό κ°μ΄ μμ±νμ΅λλ€.
const clearFirebaseData = (uid) => { const promises = []; const firestore = admin.firestore(); // delete firestore data promises.push(firestore.collection("COLLECTION").doc(uid) .delete()).catch((err) => { console.error("Error deleting document:", err); })); // delete storage data const bucket = admin.storage().bucket(); promises.push( bucket.deleteFiles({prefix: `FOLDER/${uid}/`}) .catch((err) => { console.error("Error deleting group image:", err); })); return promises; };
μ£Όμν κ²μ, document λ΄μ μλ collection μ νλ²μ μμ κ° μλλ€λ κ²μ λλ€.
firebase collection μμ νλ λ°μλ λ€μμ 2κ°μ§ λ°©λ²μ΄ μμ΅λλ€.
// 1. foreach firebase.firestore().collection(path) .listDocuments().then((val) => { val.map((doc) => doc.delete()); }).catch((err) => { console.error("Error deleting document:", err); }); // 2. using batch const batch = firebase.firestore().batch() firebase.firestore().collection(path) .listDocuments().then((val) => { val.map((doc) => batch.delete(val)); batch.commit(); }).catch((err) => { console.error("Error deleting document:", err); });
λ μ€μμ νλ‘μ νΈμ λ§λ λ°©λ²μ μ¬μ©νλ©΄ λ©λλ€.
μ°Έκ³ λ‘, firebase batch λ μΌκ΄ μ°κΈ° μμ μ μννλ κ²μΌλ‘, μ΅λ 500κ°κΉμ§ ν¬ν¨λ μ μμΌλ μ£Όμν΄μΌ ν©λλ€.
(https://firebase.google.com/docs/firestore/manage-data/transactions#batched-writes)
3) λ°°ν¬
μ΄μ μμ±ν functions λ₯Ό λ°°ν¬ν©λλ€. λ€μκ³Ό κ°μ΄ νΉμ ν¨μλ§ λ°°ν¬ν μ μμ΅λλ€.
$ firebase deploy --only functions:clearData
λ°°ν¬κ° μλ£λλ©΄ μ€μ λ‘ console μμ μ¬μ©μλ₯Ό μμ νκ³ functions λ‘κ·Έλ₯Ό 보면 functions μλ λ΄μμ νμΈν μ μμ΅λλ€.
μ΄λ κ² μ¬μ©μ μμ κ° λ λ νΈλ¦¬κ±°λλ ν¨μλ₯Ό μμ±ν΄λ³΄μμ΅λλ€.
clearFirebaseData λ₯Ό μ μμ±ν΄λλ©΄ μ΄ν μ¬μ©μκ° "μ 체 λ°μ΄ν° μμ " λ±μ μ΅μ μ μ νν λλ νμ©ν μ μμ΅λλ€.
firebase μμλ μ±μμ μ§μ collection μμ λ₯Ό κΆμ₯νμ§ μκΈ° λλ¬Έμ (곡μ μμ λ μμ) functions λ₯Ό νμ©ν΄μΌ ν©λλ€.
μ 체 컬λ μ μ μμ νλ €λ©΄ μ λ’°ν μ μλ μλ² νκ²½μμλ§ μμ νμΈμ. λͺ¨λ°μΌ λλ μΉ ν΄λΌμ΄μΈνΈμμλ 컬λ μ μ μμ ν μ μμ§λ§, μ΄ κ²½μ° λ³΄μ λ° μ±λ₯μ λΆμ μ μΈ μν₯μ λ―ΈμΉ©λλ€.
(https://firebase.google.com/docs/firestore/manage-data/delete-data?hl=ko#collections)
λ€μμλ Algolia λ₯Ό functions λ‘ μ°λν΄μ μ¬μ©ν΄λ³΄λλ‘ νκ² μ΅λλ€.
'PROGRAMMING > κΈ°ν' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ