로컬에서 함수 실행

Firebase CLI에는 다음 함수 유형을 에뮬레이션할 수 있는 Cloud Functions 에뮬레이터가 포함되어 있습니다.

  • HTTPS 함수
  • 호출 가능 함수
  • 태스크 큐 함수
  • Firebase Authentication, Realtime Database, Cloud Firestore, Cloud Storage에서 트리거되는 백그라운드 함수는 Firebase 알림 및 Cloud Pub/Sub를 지원했습니다.

함수를 프로덕션 단계로 배포하기 전에 로컬에서 테스트 실행이 가능합니다.

Firebase CLI 설치

Cloud Functions 에뮬레이터를 사용하려면 먼저 Firebase CLI를 설치하세요.

npm install -g firebase-tools

로컬 에뮬레이터를 사용하려면 Cloud Functions에서 다음을 사용해야 합니다.

  • firebase-admin 버전 8.0.0 이상이 필요합니다.
  • firebase-functions 버전 3.0.0 이상이 필요합니다.

관리자 인증 정보 설정(선택사항)

Firebase Admin SDK를 통해 함수가 Google API 및 다른 Firebase API와 상호작용하는지 테스트하기 위해서는 관리자 인증 정보를 설정해야 할 수도 있습니다.

  • Cloud FirestoreRealtime Database 트리거의 사용자 인증 정보가 이미 충분한 경우에는 추가 설정이 필요 없습니다.
  • Firebase API(예: Authentication, FCM) 또는 Google API(예: Cloud Translation API, Cloud Speech API)를 포함한 모든 API는 여기에서 설명하고 있는 설정 단계를 따라야 합니다. 이는 Cloud Functions 셸 또는 firebase emulators:start 사용 여부에 상관없이 적용되는 사항입니다.

에뮬레이션된 함수에 관리자 인증 정보를 설정하는 방법:

  1. Google Cloud 콘솔의 서비스 계정 창을 엽니다.
  2. App Engine 기본 서비스 계정이 선택되어 있는지 확인하고 오른쪽에 있는 옵션 메뉴에서 키 만들기를 선택합니다.
  3. 메시지가 나타나면 키 유형으로 JSON을 선택하고 만들기를 클릭합니다.
  4. Google 기본 사용자 인증 정보가 다운로드된 키를 가리키도록 설정합니다.

    Unix

    export GOOGLE_APPLICATION_CREDENTIALS="path/to/key.json"
    firebase emulators:start
    

    Windows

    set GOOGLE_APPLICATION_CREDENTIALS=path\to\key.json
    firebase emulators:start
    

이 단계를 완료하면 함수 테스트에서 Admin SDK를 사용하여 Firebase 및 Google API에 액세스할 수 있습니다. 예를 들어 Authentication 트리거를 테스트할 때 에뮬레이션된 함수에서 admin.auth().getUserByEmail(email)을 호출할 수 있습니다.

함수 구성 설정(선택사항)

커스텀 함수 구성 변수를 사용할 경우 먼저 functions 디렉터리 내에서 다음 명령어를 실행하여 로컬 환경에서 커스텀 구성을 가져옵니다.

firebase functions:config:get > .runtimeconfig.json
# If using Windows PowerShell, replace the above with:
# firebase functions:config:get | ac .runtimeconfig.json

에뮬레이터 도구 모음 실행

Cloud Functions 에뮬레이터를 실행하려면 emulators:start 명령어를 사용합니다.

firebase emulators:start

emulators:start 명령어를 실행하면 firebase init를 사용하여 로컬 프로젝트에서 초기화한 제품에 따라 Cloud Functions, Cloud Firestore, 실시간 데이터베이스, Firebase 호스팅용 에뮬레이터가 시작됩니다. 특정 에뮬레이터를 시작하려면 --only 플래그를 사용하세요.

firebase emulators:start --only functions

에뮬레이션이 시작된 후 테스트 모음 또는 테스트 스크립트를 실행하려면 emulators:exec 명령어를 사용합니다.

firebase emulators:exec "./my-test.sh"

앱을 구현하여 에뮬레이터와 대화하기

앱이 에뮬레이터와 상호작용하도록 구현하려면 몇 가지 추가 구성을 수행해야 할 수도 있습니다.

호출 가능한 함수를 위한 앱 구현

프로토타입 및 테스트 활동에 호출 가능한 백엔드 함수가 포함된 경우 다음과 같이 Cloud Functions for Firebase 에뮬레이터와의 상호작용을 구성합니다.

Kotlin+KTX
// 10.0.2.2 is the special IP address to connect to the 'localhost' of
// the host computer from an Android emulator.
val functions = Firebase.functions
functions.useEmulator("10.0.2.2", 5001)
Java
// 10.0.2.2 is the special IP address to connect to the 'localhost' of
// the host computer from an Android emulator.
FirebaseFunctions functions = FirebaseFunctions.getInstance();
functions.useEmulator("10.0.2.2", 5001);
Swift
Functions.functions().useFunctionsEmulator(origin: "http://127.0.0.1:5001")

Web

import { getApp } from "firebase/app";
import { getFunctions, connectFunctionsEmulator } from "firebase/functions";

const functions = getFunctions(getApp());
connectFunctionsEmulator(functions, "127.0.0.1", 5001);

Web

firebase.functions().useEmulator("127.0.0.1", 5001);

HTTPS 함수 에뮬레이션을 위한 앱 구현

코드의 각 HTTPS 함수는 다음 URL 형식을 사용하여 로컬 에뮬레이터에서 제공됩니다.

http://$HOST:$PORT/$PROJECT/$REGION/$NAME

예를 들어 기본 호스트 포트와 리전을 포함한 단순한 helloWorld 함수는 다음 형식으로 제공됩니다.

https://localhost:5001/$PROJECT/us-central1/helloWorld

태스크 큐 함수 에뮬레이션을 위한 앱 구현

에뮬레이터는 트리거 정의에 따라 에뮬레이션된 작업 큐를 자동으로 설정하고, CLOUD_TASKS_EMULATOR_HOST 환경 변수를 통해 실행 중임을 감지하면 Admin SDK는 큐에 추가된 요청을 에뮬레이터로 다시 라우팅합니다.

프로덕션에서 사용되는 전달 시스템은 에뮬레이터에 구현된 시스템보다 더 복잡하므로 에뮬레이션된 동작이 프로덕션 환경을 정확하게 반영한다고 기대해서는 안 됩니다. 에뮬레이터 내의 매개변수는 태스크가 전달되고 재시도되는 속도의 상한을 제공합니다.

백그라운드 트리거 함수 에뮬레이션을 위한 앱 구현

Cloud Functions 에뮬레이터는 다음 소스의 백그라운드 트리거 함수를 지원합니다.

  • Realtime Database 에뮬레이터
  • Cloud Firestore 에뮬레이터
  • Authentication 에뮬레이터
  • Pub/Sub 에뮬레이터
  • Firebase 알림 에뮬레이터

백그라운드 이벤트를 트리거하려면 Emulator Suite UI를 사용하거나 플랫폼용 SDK를 사용하여 에뮬레이터에 앱 또는 테스트 코드를 연결하여 백엔드 리소스를 수정하세요.

확장 프로그램에서 내보낸 커스텀 이벤트의 테스트 핸들러

Cloud Functions v2로 Firebase Extensions 커스텀 이벤트를 처리하기 위해 구현하는 함수의 경우 Cloud Functions 에뮬레이터가 Eventarc 에뮬레이터와 페어링되어 Eventarc 트리거를 지원합니다.

이벤트를 내보내는 확장 프로그램의 커스텀 이벤트 핸들러를 테스트하려면 Cloud Functions 및 Eventarc 에뮬레이터를 설치해야 합니다.

Eventarc 에뮬레이터가 실행 중인 경우 Cloud Functions 런타임은 현재 프로세스에서 EVENTARC_EMULATOR 환경 변수를 localhost:9299로 설정합니다. EVENTARC_EMULATOR 환경 변수가 설정되면 Firebase Admin SDK가 자동으로 Eventarc 에뮬레이터에 연결됩니다. Local Emulator Suite 구성에 설명된 대로 기본 포트를 수정할 수 있습니다.

환경 변수가 올바르게 구성되면 Firebase Admin SDK가 자동으로 Eventarc 에뮬레이터에 이벤트를 전송합니다. 그러면 Eventarc 에뮬레이터는 Cloud Functions 에뮬레이터를 다시 호출하여 등록된 핸들러를 트리거합니다.

Emulator Suite UI의 Functions 로그에서 핸들러 실행에 관한 자세한 내용을 확인할 수 있습니다.

다른 서비스와 상호작용

에뮬레이터 도구 모음에는 크로스 프로덕트 상호작용을 테스트할 수 있는 여러 에뮬레이터가 포함되어 있습니다.

Cloud Firestore

Firebase Admin SDK를 사용하여 Cloud Firestore에 쓰는 함수가 있는 경우, 이러한 쓰기 작업은 실행 중인 경우 Cloud Firestore 에뮬레이터로 전송됩니다. 쓰기 작업을 통해 추가로 트리거된 함수는 Cloud Functions 에뮬레이터에서 실행됩니다.

Cloud Storage

Firebase Admin SDK(버전 9.7.0 이상)를 사용하여 Cloud Storage에 쓰는 함수가 있는 경우, 이 쓰기 작업은 실행 중인 Cloud Storage 에뮬레이터로 전송됩니다. 쓰기 작업을 통해 추가로 트리거된 함수는 Cloud Functions 에뮬레이터에서 실행됩니다.

Firebase Authentication

Firebase Admin SDK(버전 9.3.0 이상)를 사용하여 Firebase Authentication에 쓰는 함수가 있는 경우, 이 쓰기 작업은 실행 중인 인증 에뮬레이터로 전송됩니다. 쓰기 작업을 통해 추가로 트리거된 함수는 Cloud Functions 에뮬레이터에서 실행됩니다.

Firebase 호스팅

Cloud Functions를 사용하여 Firebase Hosting용 동적 콘텐츠를 생성하는 경우 firebase emulators:start는 호스팅용 프록시로 로컬 HTTP 함수를 사용합니다.

Firebase 알림

지원되는 Firebase 알림 트리거가 하나 이상 포함된 프로젝트의 에뮬레이터 UI에는 FireAlerts 탭이 포함됩니다. 알림 트리거를 에뮬레이션하려면 다음 단계를 따르세요.

  1. FireAlerts 탭을 엽니다. 이 탭에는 연결된 트리거가 있는 알림 유형으로 채워진 드롭다운이 표시됩니다(예: onNewFatalIssuePublished 트리거가 있는 경우 crashlytics.newFatalIssue가 표시됨).
  2. 알림 유형을 선택합니다. 양식은 기본값으로 자동 입력되며 수정할 수 있습니다. 이벤트의 필드를 수정할 수 있습니다(알림 이벤트의 다른 정보는 추론되거나, 가상 값이거나, 무작위로 생성됨).
  3. 알림 보내기를 선택하여 Firebase 콘솔(또는 로그)의 알림에서 사용 가능한 로깅과 함께 함수 에뮬레이터에 합성 알림을 전송합니다.

로깅

에뮬레이터는 함수의 로그를 실행 중인 터미널 창으로 스트리밍합니다. 또한 함수에 포함된 console.log(), console.info(), console.error(), console.warn() 문의 모든 출력을 표시합니다.

다음 단계

Firebase 에뮬레이터 도구 모음 사용에 관한 모든 예시는 빠른 시작 샘플 테스트를 참조하세요.