[Firebase] Cloud Functions 활용하기
들어가며
토이 프로젝트를 하거나 학교 팀플 과제를 할 때, 가벼운 서버 환경이 필요한 경우가 종종 발생합니다. 가령 SMS API를 활용해서 요청이 들어오면 문자 메세지를 전송하는 기능을 담당하는 마이크로 서비스를 위한 가벼운 서버 말이죠.
이런 마이크로 서비스를 배포하기 위해서 매번 클라우드 환경 세팅을 하는 건 참으로 번거로운 일입니다. 하지만 이런 상황에서 우리를 구제해줄 녀석이 있습니다. 바로 Firebase Cloud Functions 서비스입니다.
Firebase가 뭔가요?
Firebase는 구글에서 운영하는 BaaS(Backend as a Service) 서비스입니다. 사용자 인증, 데이터베이스, 스토리지, 푸시 알림 등 모바일 서버나 웹 서버를 구축하기 위해 필요한 기능들을 대부분 갖춘 플랫폼을 제공해주는 서비스입니다. firebase를 사용하여 백엔드를 구성하게되면 매 프로젝트마다 별도로 서버를 구축하기 위해서 많은 시간을 투자하지 않아도 됩니다.
Firebase에서 제공하는 기능들은 모두 모듈 형태로서 제공이 됩니다. 따라서 다양하게 제공되는 서비스 중에서 프로젝트에 필요한 부분들만 골라서 사용할 수 있습니다. Firebase플랫폼에서 제공하는 대표적인 서비스는 다음과 같습니다.
사용자 인증 시스템(Firebase authentication)
NoSQL 기반의 데이터베이스(Firestore)
Firebase Cloud Functions
Cloud Functions for Firebase
이중에서 오늘 우리가 REST API용 서버를 구현하기 위해서 살펴볼 서비스는 Cloud Functions입니다.
Cloud Functions란 Firebase의 다른 기능들(사용자 인증, DB 사용) 등과 HTTP 요청에 의해 트리거되는 이벤트에 응답하여 백엔드 코드를 자동으로 실행할 수 있는 서버리스 프레임워크입니다. 쉽게 생각하면, 별도로 복잡한 인프라 구축없이, 손쉽게 배포까지 완료된 서버를 제공해주는 서비스입니다.
Cloud functions를 통해서 구축한 백엔드 코드(NodeJS, Typescript만 지원)는 구글의 클라우드 서버에 저장이 되고, 요청이 많아지거나 작아지면 구글에서 알아서 가상 서버 인스턴스의 개수를 조절하여 대응해줍니다. 인프라를 신경쓰지않고 필요한 서버 코드를 작성하기만 하면 됩니다.(굿)
이제부터 Firebase 프로젝트를 생성하고 로컬 환경에서 cloud functions를 활용하여 간단한 NodeJS와 express로 구성된 rest api용 서버를 만들어보겠습니다.
Firebase Cloud Functions 사용하기
Firebase 프로젝트 생성하기
첫번째로 Firebase 페이지에 접속해서 해당 부분을 클릭해서 새로운 프로젝트를 추가합니다.
새 Firebase 프로젝트에 원하는 이름을 부여하고 생성을 성공적으로 마무리하면 다음과 같은 화면을 마주할 수 있습니다.
(프로젝트 생성 중에 Google 애널리틱스 사용은 꺼도 상관없습니다.)
프로젝트 생성을 완료하고 계속 버튼을 누르면 Firebase 콘솔 화면으로 이동하게 됩니다.
(짜-잔)
알록달록한 UI가 반겨주네요. 이제 이 콘솔 화면에서 Firebase가 제공하는 다양한 서비스에 대해서 확인할 수 있고, 제어가 가능해졌습니다. 그럼 이제 본격적으로 Cloud Functions을 다뤄보겠습니다.
FIrebase CLI 설정하기
cloud functions용 함수를 작성하기 위해서는 NodeJS 환경이 필요하고, 해당 함수를 배포하기 위해서는 Firebase CLI가 필요합니다. NodeJS와 npm이 설치되어있다면 npm을 통해 Firebase CLI를 설치합니다.
npm install -g firebase-tools
firebase --version
커맨드를 통해 정상적으로 설치가 완료되었는지 확인합니다.
이제 firebase login
커맨드를 통해 아까 Firebase 프로젝트를 만들 때 사용했던 Google 아이디로 firebase CLI에 로그인합니다.
Firebase 프로젝트 디렉토리 설정
로그인이 완료되면 작업용 디렉토리를 생성합니다. 예제에서는 cf_test라는 디렉토리를 만들겠습니다. 터미널에서 해당 디렉토리로 이동한 후에 명령어를 통해 firebase 프로젝트를 초기화해줍니다.
cd cf_test
firebase init
터미널에 뜨는 항목 중 Functions를 선택하고 이후 터미널에 뜨는 지시사항에 맞춰 세팅 절차를 진행합니다
초기화가 완료되면, 해당 디렉토리에 firebase.json 파일과 functions 디렉토리가 생성됩니다. firebase 관련 세팅은 이것으로 끝났습니다. 명령어 몇줄로 간단한 서버 인프라를 구축했습니다. 이제 functions 디렉토리 내의 index.js 파일에서부터 필요한 서버 코드를 작성하면 됩니다.
Express로 간단한 서버 구현 및 배포하기
functions 디렉토리로 이동한 뒤, express 프레임워크를 설치합니다.
cd functions
npm install express
functions/index.js
파일에서 express 모듈을 불러오고 기본적인 서버 코드를 작성합니다.
const functions = require("firebase-functions");
const express = require("express");
const PORT = 7777;
const app = express();
app.get("/", (req, res) => {
res.send("hello world");
});
app.listen(PORT, () => {
console.log(`Server is runnning on port ${PORT}`);
});
교과서같은 심플 서버 코드를 구현했습니다. 이제 작성한 서버를 구글 클라우드 서버에 배포합시다. firebase init
커맨드를 실행했던 상위 디렉토리로 이동한 뒤 배포 명령어를 실행합니다.
cd ../
firebase deploy
터미널을 확인해서 배포가 잘 마무리 되었는지 확인합니다.
우리는 딸깍딸깍으로 서버가 배포되는 편안한 세상을 살고있습니다. 터미널에 찍히는 링크를 타고 들어가면 아까 봤던 Firebase 콘솔에서 우리가 배포한 함수에 대한 상세한 정보를 확인할 수 있습니다.
마치며
지금까지 간단하게 firebase cloud functions를 활용하여 REST API 서버를 구축해봤습니다. 물론 firebase가 단점 하나 없는 완벽한 수단은 아닙니다. 가끔씩 속도가 저하되는 이슈가 발생하기도 하고, 소켓 통신 등의 지속적인 연결이 필요한 환경을 위해서는 따로 서버를 생성해주는 편이 더 바람직합니다. (하지만 빨랐죠?)
간단한 HTTP Request를 처리하고 DB를 다루기 위한 마이크로 서버를 배포하기에 참 좋은 서비스라고 생각합니다. 급하게 서버가 필요하거나 간단한 프로토타이핑을 위한 서버가 필요할 때 firebase cloud functions는 좋은 도구가 되어줄 것입니다.
고맙습니다.
edited by 김동한