Firebase Summit에서 발표된 모든 내용을 살펴보고 Firebase로 앱을 빠르게 개발하고 안심하고 앱을 실행하는 방법을 알아보세요. 자세히 알아보기

시작하기: 첫 번째 함수 작성, 테스트 및 배포

Cloud Functions를 시작하려면 필수 설정 작업으로 시작하여 두 가지 관련 기능을 생성, 테스트, 배포하는 이 가이드를 진행해 보세요.

  • addMessage() , 텍스트 값을 수락하고 이를 Cloud Firestore에 쓰는 URL을 노출합니다.
  • Cloud Firestore에서 트리거하는 makeUppercase() 는 텍스트를 대문자로 쓰고 변환합니다.

Firebase 로컬 에뮬레이터 제품군 을 통해 이러한 백그라운드 트리거를 철저히 테스트할 수 있기 때문에 부분적으로 이 샘플에 대해 Cloud Firestore 및 HTTP 트리거 자바스크립트 함수를 선택했습니다. 이 도구 세트는 실시간 데이터베이스, PubSub, Auth 및 HTTP 호출 가능 트리거도 지원합니다. Remote Config, TestLab 및 Analytics 트리거와 같은 다른 유형의 백그라운드 트리거는 모두 이 페이지에 설명되지 않은 도구 세트를 사용하여 대화식으로 테스트 할 수 있습니다.

이 자습서의 다음 섹션에서는 샘플을 빌드, 테스트 및 배포하는 데 필요한 단계를 자세히 설명합니다. 코드를 실행하고 검사하려면 전체 샘플 코드 검토 로 이동하세요.

Firebase 프로젝트 만들기

  1. Firebase 콘솔 에서 프로젝트 추가 를 클릭합니다.

    • 기존 Google Cloud 프로젝트에 Firebase 리소스를 추가하려면 프로젝트 이름을 입력하거나 드롭다운 메뉴에서 선택하세요.

    • 새 프로젝트를 생성하려면 원하는 프로젝트 이름을 입력하세요. 선택적으로 프로젝트 이름 아래에 표시된 프로젝트 ID를 편집할 수도 있습니다.

  2. 메시지가 표시되면 Firebase 약관 을 검토하고 동의합니다.

  3. 계속 을 클릭합니다.

  4. (선택 사항) 다음 Firebase 제품을 사용하여 최적의 경험을 할 수 있도록 프로젝트에 Google Analytics를 설정합니다.

    기존 Google Analytics 계정 을 선택하거나 새 계정을 만드십시오.

    새 계정을 만드는 경우 Analytics 보고 위치 를 선택한 다음 프로젝트에 대한 데이터 공유 설정 및 Google Analytics 약관에 동의합니다.

  5. 프로젝트 만들기 (또는 기존 Google Cloud 프로젝트를 사용하는 경우 Firebase 추가 )를 클릭합니다.

Firebase는 Firebase 프로젝트에 대한 리소스를 자동으로 프로비저닝합니다. 프로세스가 완료되면 Firebase 콘솔에서 Firebase 프로젝트의 개요 페이지로 이동합니다.

Node.js 및 Firebase CLI 설정

함수를 작성하려면 Node.js 환경이 필요하고 Cloud Functions 런타임에 함수를 배포하려면 Firebase CLI가 필요합니다. Node.js 및 npm 을 설치하려면 Node Version Manager 를 사용하는 것이 좋습니다.

Node.js와 npm을 설치했으면 원하는 방법 으로 Firebase CLI를 설치합니다 . npm을 통해 CLI를 설치하려면 다음을 사용하십시오.

npm install -g firebase-tools

이렇게 하면 전역적으로 사용 가능한 Firebase 명령이 설치됩니다. 명령이 실패하면 npm 권한을 변경 해야 할 수 있습니다. 최신 버전의 firebase-tools 로 업데이트하려면 동일한 명령어를 다시 실행하세요.

프로젝트 초기화

Cloud Functions용 ​​Firebase SDK를 초기화할 때 종속성과 몇 가지 최소한의 샘플 코드가 포함된 빈 프로젝트를 만들고 함수 구성을 위해 TypeScript 또는 JavaScript를 선택합니다. 이 가이드의 목적을 위해 Cloud Firestore도 초기화해야 합니다.

프로젝트를 초기화하려면:

  1. firebase login 을 실행하여 브라우저를 통해 로그인하고 Firebase CLI를 인증합니다.
  2. Firebase 프로젝트 디렉토리로 이동합니다.
  3. firebase init firestore 를 실행합니다. 이 가이드에서는 Firestore 규칙 및 색인 파일을 묻는 메시지가 표시되면 기본값을 수락할 수 있습니다. 이 프로젝트에서 아직 Cloud Firestore를 사용하지 않았다면 Cloud Firestore 시작하기 에 설명된 대로 Firestore의 시작 모드와 위치도 선택해야 합니다.
  4. firebase init functions 을 실행합니다. CLI는 기존 코드베이스를 선택하거나 새 코드베이스를 초기화하고 이름을 지정하라는 메시지를 표시합니다. 이제 막 시작했다면 기본 위치에 있는 단일 코드베이스로 충분합니다. 나중에 구현이 확장됨에 따라 코드베이스에서 함수를 구성 할 수 있습니다.
  5. CLI는 언어 지원을 위한 두 가지 옵션을 제공합니다.

    이 자습서에서는 JavaScript 를 선택합니다.

  6. CLI는 npm으로 종속성을 설치하는 옵션을 제공합니다. 다른 방식으로 종속성을 관리하려는 경우 거부하는 것이 안전하지만, 거부하는 경우 기능을 에뮬레이트하거나 배포하기 전에 npm install 을 실행해야 합니다.

이 명령이 성공적으로 완료되면 프로젝트 구조는 다음과 같습니다.

myproject
 +- .firebaserc    # Hidden file that helps you quickly switch between
 |                 # projects with `firebase use`
 |
 +- firebase.json  # Describes properties for your project
 |
 +- functions/     # Directory containing all your functions code
      |
      +- .eslintrc.json  # Optional file containing rules for JavaScript linting.
      |
      +- package.json  # npm package file describing your Cloud Functions code
      |
      +- index.js      # main source file for your Cloud Functions code
      |
      +- node_modules/ # directory where your dependencies (declared in
                       # package.json) are installed

초기화 중에 생성된 package.json 파일에는 "engines": {"node": "16"} 중요한 키가 포함되어 있습니다. 함수 작성 및 배포를 위한 Node.js 버전을 지정합니다. 지원되는 다른 버전을 선택할 수 있습니다.

필수 모듈 가져오기 및 앱 초기화

설정 작업을 완료한 후 소스 디렉토리를 열고 다음 섹션에 설명된 대로 코드 추가를 시작할 수 있습니다. 이 샘플의 경우 프로젝트는 Node require 문을 사용하여 Cloud Functions 및 Admin SDK 모듈을 가져와야 합니다. index.js 파일에 다음과 같은 줄을 추가합니다.

// The Cloud Functions for Firebase SDK to create Cloud Functions and set up triggers.
const functions = require('firebase-functions');

// The Firebase Admin SDK to access Firestore.
const admin = require('firebase-admin');
admin.initializeApp();

이 줄은 firebase-functionsfirebase-admin 모듈을 로드하고 Cloud Firestore를 변경할 수 있는 admin 앱 인스턴스를 초기화합니다. FCM, 인증 및 Firebase 실시간 데이터베이스와 같이 Admin SDK 지원이 제공되는 곳이라면 어디에서나 Cloud Functions를 사용하여 Firebase를 통합하는 강력한 방법을 제공합니다.

Firebase CLI는 프로젝트를 초기화할 때 Cloud Functions 노드 모듈용 Firebase 및 Firebase SDK를 자동으로 설치합니다. 프로젝트에 타사 라이브러리를 추가하려면 package.json 을 수정하고 npm install 을 실행할 수 있습니다. 자세한 내용은 종속성 처리 를 참조하십시오.

addMessage() 함수 추가

addMessage() 함수의 경우 다음 행을 index.js 에 추가하십시오.

// Take the text parameter passed to this HTTP endpoint and insert it into 
// Firestore under the path /messages/:documentId/original
exports.addMessage = functions.https.onRequest(async (req, res) => {
  // Grab the text parameter.
  const original = req.query.text;
  // Push the new message into Firestore using the Firebase Admin SDK.
  const writeResult = await admin.firestore().collection('messages').add({original: original});
  // Send back a message that we've successfully written the message
  res.json({result: `Message with ID: ${writeResult.id} added.`});
});

addMessage() 함수는 HTTP 끝점입니다. 엔드포인트에 대한 모든 요청은 ExpressJS 스타일의 RequestResponse 객체가 onRequest() 콜백으로 전달됩니다.

HTTP 함수는 동기식( 호출 가능한 함수 와 유사)이므로 가능한 한 빨리 응답을 보내고 Cloud Firestore를 사용하여 작업을 연기해야 ​​합니다. addMessage() HTTP 함수는 HTTP 끝점에 텍스트 값을 전달하고 이를 /messages/:documentId/original 경로 아래의 데이터베이스에 삽입합니다.

makeUppercase() 함수 추가

makeUppercase() 함수의 경우 다음 행을 index.js 에 추가하십시오.

// Listens for new messages added to /messages/:documentId/original and creates an
// uppercase version of the message to /messages/:documentId/uppercase
exports.makeUppercase = functions.firestore.document('/messages/{documentId}')
    .onCreate((snap, context) => {
      // Grab the current value of what was written to Firestore.
      const original = snap.data().original;

      // Access the parameter `{documentId}` with `context.params`
      functions.logger.log('Uppercasing', context.params.documentId, original);
      
      const uppercase = original.toUpperCase();
      
      // You must return a Promise when performing asynchronous tasks inside a Functions such as
      // writing to Firestore.
      // Setting an 'uppercase' field in Firestore document returns a Promise.
      return snap.ref.set({uppercase}, {merge: true});
    });

makeUppercase() 함수는 Cloud Firestore가 작성될 때 실행됩니다. ref.set 함수는 수신할 문서를 정의합니다. 성능상의 이유로 가능한 한 구체적이어야 합니다.

중괄호(예: {documentId} )는 콜백에서 일치하는 데이터를 노출하는 와일드카드인 "매개변수"를 둘러쌉니다.

Cloud Firestore는 새 메시지가 추가될 때마다 onCreate() 콜백을 트리거합니다.

Cloud Firestore 이벤트와 같은 이벤트 기반 함수는 비동기식입니다. 콜백 함수는 null , Object 또는 Promise 를 반환해야 합니다. 아무 것도 반환하지 않으면 함수가 시간 초과되어 오류를 알리고 다시 시도됩니다. 동기화, 비동기 및 약속을 참조하십시오.

기능 실행 에뮬레이션

Firebase 로컬 에뮬레이터 제품군 을 사용하면 Firebase 프로젝트에 배포하는 대신 로컬 시스템에서 앱을 빌드하고 테스트할 수 있습니다. 부분적으로는 프로덕션 환경(예: 무한 루프)에서 비용이 발생할 수 있는 코딩 오류의 위험을 낮추기 때문에 개발 중 로컬 테스트를 강력히 권장합니다.

기능을 에뮬레이트하려면:

  1. firebase emulators:start 를 실행하고 Emulator Suite UI의 URL에 대한 출력을 확인합니다. 기본값은 localhost:4000 이지만 컴퓨터의 다른 포트에서 호스팅될 수 있습니다. 브라우저에 해당 URL을 입력하여 Emulator Suite UI를 엽니다.

  2. HTTP 함수 addMessage() 의 URL에 대한 firebase emulators:start 명령어의 출력을 확인합니다. 다음을 제외하고 http://localhost:5001/MY_PROJECT/us-central1/addMessage 와 유사하게 보입니다.

    1. MY_PROJECT 는 프로젝트 ID로 대체됩니다.
    2. 포트는 로컬 시스템에서 다를 수 있습니다.
  3. 함수 URL 끝에 쿼리 ​​문자열 ?text=uppercaseme 를 추가합니다. 이것은 다음과 같아야 합니다: http://localhost:5001/MY_PROJECT/us-central1/addMessage?text=uppercaseme . 선택적으로 "대문자" 메시지를 사용자 정의 메시지로 변경할 수 있습니다.

  4. 브라우저의 새 탭에서 URL을 열어 새 메시지를 작성하십시오.

  5. Emulator Suite UI에서 기능의 효과 보기:

    1. 로그 탭에서 addMessage()makeUppercase() 함수가 실행되었음을 나타내는 새 로그가 표시되어야 합니다.

      i 함수: "addMessage" 실행 시작

      i 함수: "makeUppercase" 실행 시작

    2. Firestore 탭에 원본 메시지와 대문자 버전이 포함된 문서가 표시되어야 합니다(원래 "대문자"인 경우 "UPPERCASEME"으로 표시됨).

프로덕션 환경에 기능 배포

기능이 에뮬레이터에서 원하는 대로 작동하면 프로덕션 환경에서 배포, 테스트 및 실행을 진행할 수 있습니다. 권장되는 Node.js 14 런타임 환경에 배포하려면 프로젝트가 Blaze 요금제 에 있어야 합니다. Cloud Functions 가격 책정 을 참조하세요.

튜토리얼을 완료하려면 함수를 배포한 다음 addMessage() 를 실행하여 makeUppercase() ) 를 트리거하십시오.

  1. 다음 명령을 실행하여 함수를 배포합니다.

     firebase deploy --only functions
     

    이 명령어를 실행하면 Firebase CLI가 모든 HTTP 함수 엔드포인트에 대한 URL을 출력합니다. 터미널에 다음과 같은 줄이 표시되어야 합니다.

    Function URL (addMessage): https://us-central1-MY_PROJECT.cloudfunctions.net/addMessage
    

    URL에는 프로젝트 ID와 HTTP 기능에 대한 지역이 포함됩니다. 지금은 걱정할 필요가 없지만 일부 프로덕션 HTTP 기능은 네트워크 대기 시간을 최소화하기 위해 위치 를 지정해야 합니다.

    "프로젝트에 대한 액세스 권한을 부여할 수 없음"과 같은 액세스 오류가 발생하면 프로젝트 별칭 을 확인하십시오.

  2. CLI의 addMessage() URL 출력을 사용하여 텍스트 쿼리 매개변수를 추가하고 브라우저에서 엽니다.

    https://us-central1-MY_PROJECT.cloudfunctions.net/addMessage?text=uppercasemetoo
    

    이 함수는 텍스트 문자열이 저장된 데이터베이스 위치에 있는 Firebase 콘솔로 브라우저를 실행하고 리디렉션합니다. 이 쓰기 이벤트는 문자열의 대문자 버전을 쓰는 makeUppercase() 를 트리거합니다.

기능을 배포하고 실행한 후 Google Cloud Console 에서 로그를 볼 수 있습니다. 개발 또는 프로덕션에서 함수를 삭제 해야 하는 경우 Firebase CLI를 사용하세요.

프로덕션에서는 실행할 최소 및 최대 인스턴스 수를 설정하여 기능 성능을 최적화하고 비용을 제어할 수 있습니다. 이러한 런타임 옵션에 대한 자세한 내용은 조정 동작 제어 를 참조하세요.

전체 샘플 코드 검토

다음은 addMessage()makeUppercase() 함수를 포함하는 완성된 functions/index.js 입니다. 이러한 함수를 사용하면 Cloud Firestore에 값을 쓴 다음 문자열의 모든 문자를 대문자로 변환하여 매개변수를 HTTP 엔드포인트에 전달할 수 있습니다.

// The Cloud Functions for Firebase SDK to create Cloud Functions and set up triggers.
const functions = require('firebase-functions');

// The Firebase Admin SDK to access Firestore.
const admin = require('firebase-admin');
admin.initializeApp();

// Take the text parameter passed to this HTTP endpoint and insert it into 
// Firestore under the path /messages/:documentId/original
exports.addMessage = functions.https.onRequest(async (req, res) => {
  // Grab the text parameter.
  const original = req.query.text;
  // Push the new message into Firestore using the Firebase Admin SDK.
  const writeResult = await admin.firestore().collection('messages').add({original: original});
  // Send back a message that we've successfully written the message
  res.json({result: `Message with ID: ${writeResult.id} added.`});
});

// Listens for new messages added to /messages/:documentId/original and creates an
// uppercase version of the message to /messages/:documentId/uppercase
exports.makeUppercase = functions.firestore.document('/messages/{documentId}')
    .onCreate((snap, context) => {
      // Grab the current value of what was written to Firestore.
      const original = snap.data().original;

      // Access the parameter `{documentId}` with `context.params`
      functions.logger.log('Uppercasing', context.params.documentId, original);
      
      const uppercase = original.toUpperCase();
      
      // You must return a Promise when performing asynchronous tasks inside a Functions such as
      // writing to Firestore.
      // Setting an 'uppercase' field in Firestore document returns a Promise.
      return snap.ref.set({uppercase}, {merge: true});
    });

다음 단계

이 문서에서는 Cloud Functions 의 일반적인 개념 과 Cloud Functions에서 지원하는 이벤트 유형을 처리하기 위한 함수 작성 가이드에 대한 자세한 정보를 찾을 수 있습니다.

Cloud Functions에 대해 자세히 알아보려면 다음을 수행할 수도 있습니다.

비디오 튜토리얼

동영상 가이드를 보고 Cloud Functions에 대해 자세히 알아볼 수 있습니다. 이 동영상에서는 Node.js 및 CLI 설정을 포함하여 Cloud Functions 시작에 대한 자세한 지침을 찾을 수 있습니다.