본문 바로가기

공부/Server

[Firebase] Functions 초기 세팅 하기

Firebase가 제공하는 클라우드 함수 functions 사용법에 대해 정리해보았다

그리고 functions를 사용하기 위해서는 요금제 업그레이드가 필요하다

 

공식문서에서는 클라우드 함수를 아래와 같이 정의하고 있다

Cloud Functions for Firebase는 서버리스 프레임워크로, Firebase 기능 및 HTTPS 요청에 의해 트리거된 이벤트에 대한 응답으로 백엔드 코드를 자동으로 실행할 수 있습니다. JavaScript 또는 TypeScript 코드는 Google 클라우드에 저장되며 관리되는 환경에서 실행됩니다.

 

보통 firebase의 admin 함수를 클라이언트에서 직접 호출해서 사용한다

 

하지만 클라이언트에서 요청이 이루어지기 때문에, 같은 db를 사용하더라도 다시 입력하는 코드 중복이 발생하게 된다

이러한 문제를  해결하기 위해, 서버리스 프레임워크인 functions를 사용하면
node.js 환경에서 실행 가능한 API/REST API 를 만들 수 있다

= 클라이언트와 백엔드의 분리

 

 

이제 빠르게 과정을 살펴보자

1. 프로젝트 터미널에서 firebase 로그인

firebase login

 

2. 프로젝트에서 firebase functions를 설치

firebase init functions

fucntions를 설치하고 나면 'friebase_프로젝트명' 이 생성된다

해당 폴더 안에는 functions 폴더가 생성된다

폴더 안에는 클라우드 함수와 관련된 모든 것이 위치한다

 

3. firebase init functions (프로젝트 폴더안에서) → firebase_프로젝트명

cd functions
npm run serve

 

4. asia-northeast3 서버로 맞추고, firestore 만들기

만약 기존에 존재하는 firestore을 사용한다면 생략한다

 

5. admin key 다운

프로젝트 설정 - 서비스 계정 - 비공개 키 생성 - functions/config폴더 안에 다운받은 json 파일 넣기

 

6. admin initialize

Admin SDK도 복사해야한다

중복 제거를 위해 config 폴더를 만들고 admin key를 분리했다 (json 파일 이름 수정함)

serviceAccount 변수를 만들고, 자신의 key를 입력하면된다

const admin = require("firebase-admin");
const serviceAccount = require('./config/firebase-test-adminsdk.json');

admin.initializeApp({
    credential: admin.credential.cert(serviceAccount)
});

module.exports = admin

 

7. DB 서버 위치 맞추기

가끔씩 서버 위치가 US로 맞춰있어 문제가 발생할 때도 있어서

aisa로 설정했는데 이를 설정해준다

const regionHttps = functions.region('asia-northeast3').https;

exports.helloWorld = regionHttps.onRequest((request, response) => {
    functions.logger.info("Hello logs!", {structuredData: true}); 
    response.send("Hello from Firebase!");
});

 

8. index.js에 함수 작성하고 사용하기

이제 세팅은 끝났다

index.js에 클라우드 함수를 만들고 API 호출을 해주면 된다

 

필자는 postman을 사용했다

 

아래 코드를 사용해서 설명하면 

1. helloWorld라는 이름의 request를 생성하고

2. 해당 request가 발생하면 터미널 로그를 작성한다

3. 응답으로 Hello from Firebase! 가 보내진다

exports.helloWorld = regionHttps.onRequest((request, response) => {
    functions.logger.info("Hello logs!", {structuredData: true}); 
    response.send("Hello from Firebase!");
});