์๋ ํ์ธ์ Foma ์ ๋๋ค!
์ค๋์ Cloud Functions ์ ์ด์ฉํด์ Firestore ๋ฐ์ดํฐ๋ฒ ์ด์ค์ Algolia์ ์ธ๋ฑ์ค๋ฅผ ์ฐ๋ํ๋๊ฑธ ์ ๋ฆฌํด๋ณด๊ฒ ์ต๋๋ค.
์ด๋ฒ ๊ธ์์๋ ํด๋ผ์ฐ๋ ํ์ ๊ธฐ๋ณธ์ธํ ๊ณผ ์๊ณ ๋ฆฌ์ ๊ธฐ๋ณธ์ธํ ์ด ํ์ํ๋ฏ๋ก
ํด๋ผ์ฐ๋ ํ์ ์ธํ ์ ์ฌ๊ธฐ ์์ ์๊ณ ๋ฆฌ์ ๊ธฐ๋ณธ์ธํ ์ ์ฌ๊ธฐ ์์ ๋จผ์ ๋ณด๊ณ ์์ฃผ์ธ์~
๋ฐ๋ก ์์ํ ๊ฒ์~
Pod
๋จผ์ Algolia์ Cloud Function๊ณผ Firestore๋ฅผ ์ฝ์ฝ์ํ์ ์ถ๊ฐํด์ฃผ์ธ์.
pod 'AlgoliaSearchClient', '~> 8.0'
pod 'Firebase/Functions'
pod 'Firebase/Firestore'
ํฐ๋ฏธ๋์์ functions๋ก ์ด๋ํ npm์ผ๋ก ์๊ณ ๋ฆฌ์๋ฅผ ์ค์นํด์ค๋๋ค.
cd functions
npm install algoliasearch
Algolia ๋์ฌ๋ณด๋๋ก ๋ค์ด๊ฐ ์ฑ ์ด๋ฆ๊ณผ APIํค๋ฅผ ์ ์ฅํด์ค๋๋ค.
ํฐ๋ฏธ๋์ ์ฑ์ด๋ฆ๊ณผ ์ด๋๋ฏผ APIKEY๋ฅผ ์ ์ด์ค๋๋ค.
firebase functions:config:set algolia.app="์ฑ์ด๋ฆ" algolia.key="์ด๋๋ฏผAPIKEY"
์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋๋ค๋ฉด ์๋์ ๊ฐ์ด ์ถ๋ ฅ๋ ๊ฑฐ์์!
Visual Studio
๋น์ฅฌ์ผ ์คํ๋์ค์์ ํด๋น ํ๋ก์ ํธ์ functions ํ์ผ๋ก ๋ค์ด๊ฐ index.js ํ์ผ์ ์ด์ด์ฃผ์ธ์!
์๋์ ๊ฐ์ด ๊ธฐ๋ณธ ์ธํ ์ ํด์ค๋๋ค.
//ํด๋ผ์ฐ๋ ํ์
์ธํ
const functions = require("firebase-functions");
//์ด๋๋ฏผ ์ธํ
const admin = require('firebase-admin');
//์๊ณ ๋ฆฌ์ ์ธํ
const algoliasearch = require('algoliasearch');
//์๊ณ ๋ฆฌ์ ์ฑ์์ด๋
const APP_ID = functions.config().algolia.app;
//์๊ณ ๋ฆฌ์ ์ด๋๋ฏผํค
const ADMIN_KEY = functions.config().algolia.key;
//์๊ณ ๋ฆฌ์ ํด๋ผ์ด์ธํธ ์ธํ
const client = algoliasearch(APP_ID, ADMIN_KEY);
//์๊ณ ๋ฆฌ์ ์ธ๋ฑ์ค ์ด๋ฆ ์ธํ
const index = client.initIndex('์ธ๋ฑ์ค ์ด๋ฆ');
//์ด๋๋ฏผ์ ํ์ด์ด์คํ ์ด๋ก ์ธํ
admin.initializeApp(functions.config().firestore);
์์ฑ๋์์๋
(์ํํธ ๊ด๋ จ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๊ณ ์์ด์ Apart ๋ํ๋จผํธ๋ก ์ง์ ํ์ง๋ง ์ปฌ๋ ์ ์ด๋ฆ/{์ปฌ๋ ์ ์ด๋ฆ + Id}๋ก ํด์ฃผ์๋ฉด ๋ฉ๋๋ค.)
exports.onApartsCreated = functions.firestore.document("Apart/{ApartId}").onCreate((snap, context) => {
const apart = snap.data();
const objectID = snap.id;
index.saveObject({ ...apart, objectID });
});
์์ ๋์์๋
exports.onApartUpdated = functions.firestore.document("Apart/{ApartId}").onUpdate((snap, context) => {
const apart = snap.after.data();
const objectID = snap.after.id;
index.saveObject({ ...apart, objectID });
});
์ญ์ ๋์์๋
exports.onApartDeleted = functions.firestore.document("Apart/{ApartId}").onDelete((snap, context) => {
const id = snap.id;
index.deleteObject(id);
});
ํจ์๋ฐฐํฌ
์์ ๊ฐ์ด ์์ฑ,์์ ,์ญ์ ๋์์๋ ํจ์๋ฅผ ๋ง๋ค์ด์ฃผ์๊ณ ํ์ด์ด๋ฒ ์ด์ค์ ํจ์๋ฅผ ๋ฐฐํฌํด์ค๋๋ค.
ํฐ๋ฏธ๋์ ์๋์ ๊ฐ์ด ์ ๋ ฅํฉ๋๋ค.
firebase deploy --only functions
(ํน์ ๋ค์๊ณผ ๊ฐ์ ์๋ฌ๊ฐ ๋จ์๋ ๋ถ๋ค์ .eslintrc.js ํ์ผ์ ์ญ์ ํ๊ณ eslint๋ฅผ ๋ค์ ๋ง๋ค์ด์ฃผ์ธ์. ์ด๊ฒ ๋ง๋ ๋ฐฉ๋ฒ์ธ์ง๋ ๋ชจ๋ฅด๊ฒ ์ผ๋ ์ ํด๊ฒฐ๋์์ต๋๋ค....)
--eslint init
์ค๋ฅ๊ฐ ๋์ ๋ถ๋ค์ ๋ค์๊ณผ ๊ฐ์ด ์ธํ ํด์ฃผ์ธ์.
์ฑ๊ณต์ ์ผ๋ก ํจ์๊ฐ ๋ฐฐํฌ๋์๋ค๋ฉด ์๋์ ๊ฐ์ด Deploy complete๊ฐ ๋์ค๊ณ ํ๋ก์ ํธ ์ฝ์ ์ฃผ์๊ฐ ๋์ต๋๋ค.
Firebase Console
ํ์ด์ด๋ฒ ์ด์ค ์ฝ์๋ก ์ด๋ํฉ๋๋ค.
Cloud Functions ํญ์ ๋ณด๋ฉด ์ฑ๊ณต์ ์ผ๋ก 3๊ฐ์ ํจ์๊ฐ ์ฌ๋ผ๊ฐ์๋๊ฑธ ๋ณผ ์ ์์ต๋๋ค!
์ ํจ์๋ค์ ํ์ด์ด์คํ ์ด์์ ์์ฑ,์์ ,์ญ์ ๋์์๋ ์์์ ์คํ๋ ๊ฑฐ์์.
Xcode
์ด์ ํ๋ก์ ํธ๋ก ์ด๋ํด์ ํ์ด์ด์คํ ์ด์ ๋ฐ์ดํฐ๋ฅผ ์์ฑํด๋ด ์๋ค.
ํ์ด์ด์คํ ์ด๋ฅผ import ํด์ฃผ์๊ณ
import FirebaseFirestore
์์ฑ
Firestore์ ๋ฌธ์๋ฅผ ์์ฑํฉ๋๋ค.
Firestore.firestore().collection("Apart").addDocument(data: ["aptName":"ํ์ฌ๋์ํํธ"])
Apart ์ปฌ๋ ์ ์ ๋ฐ์ดํฐ๊ฐ ์๊ธฐ๊ณ
Functions์ ๋ก๊ทธํญ์ ๊ฐ์ ํ์ธํด๋ณด๋ฉด
Apart๊ฐ ์์ฑ๋์์๋์ ํจ์๊ฐ ์คํ๋๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
๋ํ Algolia์ Indicies๋ก ๊ฐ๋ฉด Apart ์ธ๋ฑ์ค๊ฐ ์๊ธฐ๊ณ ํด๋น ์ค๋ธ์ ํธ๊ฐ ์์ฑ๋๊ฑธ ๋ณผ ์ ์์ต๋๋ค.
์์
ํ์ด์ด์คํ ์ด์์ ํด๋น ๋ฌธ์์ ์ํํธ ์ด๋ฆ์ ์ฅ๋ฏธ์ํํธ๋ก ๋ฐ๊ฟ๋ณด๊ฒ ์ต๋๋ค.
Firestore.firestore().collection("Apart").document("Gsw0Qg39ZZsXuIcgAUGq").updateData(["aptName":"์ฅ๋ฏธ์ํํธ"])
ํ์ด์ด์คํ ์ด์์ ์ํํธ ์ด๋ฆ์ด ์ฅ๋ฏธ์ํํธ๋ก ์์ ๋์๊ณ
Functions์ ๋ก๊ทธ๋ก ๋ค์ด๊ฐ์ ํ์ธํด๋ณด๋ฉด ์ ๋ฐ์ดํธ ํจ์๊ฐ ์คํ๋ ๊ฑธ ๋ณผ ์ ์์ต๋๋ค.
๋ํ Algolia์ ํด๋น ์ค๋ธ์ ํธ๋ ์ฅ๋ฏธ์ํํธ๋ก ์ ๋ฐ๋๊ฑธ ๋ณผ ์ ์์ต๋๋ค.
์ญ์
๋ง์ง๋ง์ผ๋ก ํด๋น ๋ฌธ์๋ฅผ ํ์ด์ด์คํ ์ด์์ ์ญ์ ํด์ค๋๋ค.
Firestore.firestore().collection("Apart").document("Gsw0Qg39ZZsXuIcgAUGq").delete()
ํ์ด์ด์คํ ์ด์ ๋ฐ์ดํฐ๊ฐ ์ญ์ ๋๊ณ
Functions์ ์ญ์ ํจ์๊ฐ ์คํ๋๊ฑธ ๋ณผ ์ ์์ต๋๋ค.
Algolia์์๋ ํด๋น ์ค๋ธ์ ํธ๊ฐ ์ญ์ ๋ ๊ฑธ ๋ณผ ์ ์์ต๋๋ค!
์ค๋์ ์ด๋ ๊ฒ ํด๋ผ์ฐ๋ ํ์ ์ผ๋ก ํ์ด์ด์คํ ์ด์ ์๊ณ ๋ฆฌ์ ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ฒฐ์ํค๋ ๋ฒ์ ๋ํด์ ์์๋ณด์์ต๋๋ค.
์์ ๋ถํฐ ํด๋ผ์ฐ๋ ํ์ ์ ๋ํด ๊ณต๋ถํ๊ณ ์ถ์๋๋ฐ ๊ตฌ์ฒด์ ์ผ๋ก ์์๋ณด๊ฒ ๋ผ์ ๊ธฐ๋ถ์ด ์ข๋ค์ ใ ใ
ํน์๋ผ๋ ํ๋ฆฐ์ ์ด ์๊ฑฐ๋ ๊ถ๊ธํ์ ์ ์ด ์๋ค๋ฉด ๋๊ธ๋ก ์๋ ค์ฃผ์ธ์!
Reference
fireship.io/lessons/algolia-cloud-functions/
๋๊ธ