쉽게 따라하는 Firebase Cloud Functions - 2. 함수 배포

저번 글에서는 어떻게 프로젝트를 생성하는지를 알아보았고,
이번 글에서는 함수를 작성하고 배포하는 방법을 알아보도록 하겠다.

저번 글에서 CLI로 생성한 프로젝트 디렉토리를 보면 functions/index.js가 기본적으로 생성되어 있는데,
index.js를 보면 함수 기본 템플릿이 주석 처리되어있다.

1
2
3
4
5
6
7
8
9
10
// functions/index.js

const functions = require('firebase-functions');

// // Create and Deploy Your First Cloud Functions
// // https://firebase.google.com/docs/functions/write-firebase-functions
//
// exports.helloWorld = functions.https.onRequest((request, response) => {
// response.send("Hello from Firebase!");
// });

간단하게 주석을 풀면 “Hello from Firebase!”를 응답하는 helloWorld 함수를 생성한 것이다.
(게다가 주석에 친절하게 기초 가이드 링크도 있다)

그러면 아래와 같이 함수 부분에 주석을 풀고 불필요한 주석을 제거해보자.

1
2
3
4
5
6
7
// functions/index.js

const functions = require('firebase-functions');

exports.helloWorld = functions.https.onRequest((request, response) => {
response.send("Hello from Firebase!");
});

이제 이 helloWorld 함수를 배포할 수 있지만, 그래도 로컬에서 한 번 테스트를 해보는 편이 좋을 것 같다.
함수를 로컬에서 실행시키고자 할 경우, firebase serve 커맨드를 입력하면 실행하면 된다.

1
2
3
4
5
6
7
8
$ firebase serve

=== Serving from 'C:\Users\sonyc\my\study\firebase\cloud-functions-tutorial'...

+ functions: Using node@8 from host.
+ functions: Emulator started at http://localhost:5000
i functions: Watching "C:\Users\sonyc\my\study\firebase\cloud-functions-tutorial\functions" for Cloud Functions...
+ functions[helloWorld]: http function initialized (http://localhost:5000/devson-cloud-functions/us-central1/helloWorld).

Postman으로 콘솔에 찍힌 URL로 요청을 보내면 response.send 메서드의 파라미터를 보내는 것을 확인할 수 있다.

이제 확인은 했으니 Firebase 서버로 배포를 하자.
함수를 배포할 때는 firebase deploy --only functions 커맨드를 사용한다.
해당 커맨드는 Firebase 프로젝트에 함수(Cloud Functions)만을 배포한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ firebase deploy --only functions

=== Deploying to 'devson-cloud-functions'...

i deploying functions
i functions: ensuring necessary APIs are enabled...
+ functions: all necessary APIs are enabled
i functions: preparing functions directory for uploading...
i functions: packaged functions (22.7 KB) for uploading
+ functions: functions folder uploaded successfully
i functions: creating Node.js 8 function helloWorld(us-central1)...
+ functions[helloWorld(us-central1)]: Successful create operation.
Function URL (helloWorld): https://us-central1-devson-cloud-functions.cloudfunctions.net/helloWorld

+ Deploy complete!

Project Console: https://console.firebase.google.com/project/devson-cloud-functions/overview

배포가 성공적으로 완료되었다면 콘솔에 출력된 Project Console URL에 접속 후 Functions 탭에 들어가면,
우리가 배포한 helloWorld 함수가 있는 것을 확인할 수 있다.

이제 이 함수가 실제로 잘 배포되었는지 요청을 해보자.
트리거 컬럼에 있는 URL로 호출을 하면 로컬에서 테스트한 것과 같은 결과를 받을 수 있다.

여기서 추가로 함수를 하나 더 만들어보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
// functions/index.js

const functions = require('firebase-functions');

exports.helloWorld = functions.https.onRequest((request, response) => {
response.send("Hello from Firebase!");
});

// 추가 된 greet 함수
exports.greet = functions.https.onRequest((request, response) => {
const { name } = request.body;
response.send(`Hello ${name}`);
});

greet 함수는 사용자 request의 body에서 name을 가져와 인사를 하는 함수이다. :)
이 함수도 마찬가지로 firebase serve를 통해 로컬에서 테스트해보자.

이제 이 함수를 배포하면 되는데,
firebase deploy --only functions의 경우 모든 함수를 배포한다.
하지만 이 경우 변경되지 않은 함수 또한 같이 재배포되기 때문에 비효율적이다.
그래서 방금 새로 만든 greet 함수만 배포한다면 효율적이고 이전 함수에도 영향을 주지 않을 것이다.

Firebase CLI에는 앞서 설명한 특정 함수만을 배포하는 기능을 제공하며 그 커맨드는 다음과 같다.
firebase deploy --only function:함수명
이제 이 greet함수를 배포해보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ firebase deploy --only functions:greet

=== Deploying to 'devson-cloud-functions'...

i deploying functions
i functions: ensuring necessary APIs are enabled...
+ functions: all necessary APIs are enabled
i functions: preparing functions directory for uploading...
i functions: packaged functions (22.74 KB) for uploading
+ functions: functions folder uploaded successfully
i functions: current functions in project: helloWorld(us-central1)
i functions: uploading functions in project: greet(us-central1)
i functions: creating Node.js 8 function greet(us-central1)...
+ functions[greet(us-central1)]: Successful create operation.
Function URL (greet): https://us-central1-devson-cloud-functions.cloudfunctions.net/greet

+ Deploy complete!

Project Console: https://console.firebase.google.com/project/devson-cloud-functions/overview

다시 Project Console의 Functions 탭에 들어가면 greet 함수가 추가된 것을 확인할 수 있다.

배포된 함수에 요청을 해서 다시 이 함수를 확인해보자.

위와 같이 정상 작동을 하는 것을 확인할 수 있다.


참고
https://firebase.google.com/docs/functions/manage-functions?hl=ko
https://firebase.google.com/docs/cli/?hl=ko#top_of_page

Share