PROGRAMMING/기타

[Firebase] Functions 둜 μ‚¬μš©μž μ‚­μ œ μ‹œ 데이터 μ‚­μ œ κ΅¬ν˜„

\b\t 2022. 1. 20. 13:50

 

μ΄λ²ˆμ—λŠ” Firebase Functions λ₯Ό μ΄μš©ν•΄μ„œ μ‚¬μš©μžλ₯Ό μ‚­μ œν•˜λ©΄ κ·Έ μ‚¬μš©μžμ™€ κ΄€λ ¨λœ 데이터도 μ‚­μ œν•˜λ„λ‘ ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

firestore, storage λ₯Ό μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— 이 λ‘˜μ„ νƒ€κ²ŸμœΌλ‘œ ν•˜μ—¬ μ‚¬μš©μž μ‚­μ œ μ‹œ 트리거될 functions λ₯Ό μž‘μ„±ν•˜λ©΄ λ©λ‹ˆλ‹€.

 

* λͺ¨λ“  λ‚΄μš©μ€ functions/index.js μ—μ„œ μž‘μ„±ν–ˆμŠ΅λ‹ˆλ‹€.

* cloud functions 섀정은 이전 ν¬μŠ€νŒ…μ— μžˆμŠ΅λ‹ˆλ‹€.

2022.01.20 - [PROGRAMMING/기타] - [Firebase] Firebase Functions CLI μ‚¬μš©ν•˜κΈ°, ν•¨μˆ˜ 배포, 리전 λ³€κ²½

 

[Firebase] Firebase Functions CLI μ‚¬μš©ν•˜κΈ°, ν•¨μˆ˜ 배포, 리전 λ³€κ²½

Firebase λŠ” Google 의 λͺ¨λ°”일 및 μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 개발 ν”Œλ ›νΌμž…λ‹ˆλ‹€. μ‹€μ‹œκ°„ 데이터 동기화 λ“±μ˜ μž₯점이 μžˆμ–΄ λ°±μ—”λ“œλ₯Ό κ΅¬ν˜„ν•  여건이 λ˜μ§€ μ•Šκ±°λ‚˜ λΉ„μš©μ μΈ 츑면을 κ³ λ €ν•œλ‹€λ©΄ μΆ©λΆ„νžˆ 맀λ ₯적인

iforint.tistory.com

 

 

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 μž‘λ™ 내역을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

 

log

 

μ΄λ ‡κ²Œ μ‚¬μš©μž μ‚­μ œκ°€ 될 λ•Œ νŠΈλ¦¬κ±°λ˜λŠ” ν•¨μˆ˜λ₯Ό μž‘μ„±ν•΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

 

clearFirebaseData λ₯Ό 잘 μž‘μ„±ν•΄λ‘λ©΄ 이후 μ‚¬μš©μžκ°€ "전체 데이터 μ‚­μ œ" λ“±μ˜ μ˜΅μ…˜μ„ 선택할 λ•Œλ„ ν™œμš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

firebase μ—μ„œλŠ” μ•±μ—μ„œ 직접 collection μ‚­μ œλ₯Ό ꢌμž₯ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— (곡식 μ˜ˆμ œλ„ μ—†μŒ) functions λ₯Ό ν™œμš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

 

전체 μ»¬λ ‰μ…˜μ„ μ‚­μ œν•˜λ €λ©΄ μ‹ λ’°ν•  수 μžˆλŠ” μ„œλ²„ ν™˜κ²½μ—μ„œλ§Œ μ‚­μ œν•˜μ„Έμš”. λͺ¨λ°”일 λ˜λŠ” μ›Ή ν΄λΌμ΄μ–ΈνŠΈμ—μ„œλ„ μ»¬λ ‰μ…˜μ„ μ‚­μ œν•  수 μžˆμ§€λ§Œ, 이 경우 λ³΄μ•ˆ 및 μ„±λŠ₯에 뢀정적인 영ν–₯을 λ―ΈμΉ©λ‹ˆλ‹€.

(https://firebase.google.com/docs/firestore/manage-data/delete-data?hl=ko#collections)

 

 

λ‹€μŒμ—λŠ” Algolia λ₯Ό functions 둜 μ—°λ™ν•΄μ„œ μ‚¬μš©ν•΄λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.