로컬에서 Firestore 에뮬레이션

Google Cloud CLI는 애플리케이션을 테스트하는 데 사용할 수 있는 Firestore용 로컬 인메모리 에뮬레이터를 제공합니다. 에뮬레이터는 모든 Firestore 클라이언트 라이브러리에서 사용할 수 있습니다. 에뮬레이터는 로컬 테스트에만 사용해야 합니다.

프로덕션 배포에는 에뮬레이터를 사용하지 마세요. 에뮬레이터는 메모리에만 데이터를 저장하므로 여러 번 실행할 경우 데이터가 유지되지 않습니다.

에뮬레이터 설치

Firestore 에뮬레이터를 설치하려면 gcloud CLI를 설치하고 업데이트합니다.

  1. gcloud CLI를 설치합니다.

  2. 최신 기능을 이용하려면 gcloud CLI 설치를 업데이트하세요.

    gcloud components update
    

에뮬레이터 실행

  1. 다음 명령어를 실행하여 에뮬레이터를 시작합니다.

    gcloud emulators firestore start
    

    에뮬레이터가 실행되고 있는 호스트와 포트 번호가 출력됩니다.

    기본적으로 에뮬레이터는 127.0.0.1:8080 사용을 시도합니다. 에뮬레이터를 특정 호스트 및 포트에 결합하려면 선택사항인 --host-port 플래그를 사용하고, HOSTPORT를 바꿉니다.

    gcloud emulators firestore start --host-port=HOST:PORT
    
  2. Control + C를 입력하여 에뮬레이터를 중지합니다.

에뮬레이터에 연결

에뮬레이터에 연결하는 방법은 클라이언트 라이브러리, 서버 클라이언트 라이브러리 또는 모바일/웹 SDK의 유형에 따라 다릅니다.

서버 클라이언트 라이브러리

Firestore 서버 클라이언트 라이브러리(C#, Go, 자바, Node.js, PHP, Python, Ruby)를 연결하려면 FIRESTORE_EMULATOR_HOST 환경 변수를 설정합니다. 이 환경 변수가 설정되면 서버 클라이언트 라이브러리가 자동으로 에뮬레이터에 연결됩니다.

export FIRESTORE_EMULATOR_HOST="HOST:PORT"

Android, Apple 플랫폼, 웹 SDK

다음 예시는 Android, Apple 플랫폼, 웹 SDK를 Firestore 에뮬레이터에 연결하는 방법을 보여줍니다.

Android
// 10.0.2.2 is the special IP address to connect to the 'localhost' of
// the host computer from an Android emulator.
FirebaseFirestore firestore = FirebaseFirestore.getInstance();
firestore.useEmulator("10.0.2.2", 8080);

FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder()
        .setPersistenceEnabled(false)
        .build();
firestore.setFirestoreSettings(settings);
Swift
let settings = Firestore.firestore().settings
settings.host = "127.0.0.1:8080"
settings.isPersistenceEnabled = false
settings.isSSLEnabled = false
Firestore.firestore().settings = settings

웹 버전 9

import { getFirestore, connectFirestoreEmulator } from "firebase/firestore";

// firebaseApps previously initialized using initializeApp()
const db = getFirestore();
connectFirestoreEmulator(db, '127.0.0.1', 8080);

웹 버전 8

// Firebase previously initialized using firebase.initializeApp().
var db = firebase.firestore();
if (location.hostname === "localhost") {
  db.useEmulator("127.0.0.1", 8080);
}

Firestore 에뮬레이터는 종료 시 데이터베이스 콘텐츠를 삭제합니다. Firestore SDK의 오프라인 캐시는 자동으로 삭제되지 않으므로 에뮬레이터 구성에서 로컬 지속성을 사용 중지하여 에뮬레이션된 데이터베이스와 로컬 캐시 간의 불일치를 방지하는 것이 좋습니다. 웹 SDK에서 지속성은 기본적으로 사용 중지되어 있습니다.

에뮬레이터 데이터 삭제

Firestore 에뮬레이터에는 현재 에뮬레이터에 있는 모든 데이터를 삭제하기 위한 REST 엔드포인트가 포함됩니다. 이 엔드포인트를 사용하면 에뮬레이터를 종료하지 않고도 테스트 간에 데이터를 삭제할 수 있습니다.

에뮬레이터의 모든 데이터를 삭제하려면 다음 엔드포인트에 대해 HTTP DELETE 작업을 수행합니다. 여기서 HOSTPORT를 선택한 호스트 및 포트로 바꾸고 PROJECT_ID를 자체 프로젝트 ID로 바꿉니다.

http://HOST:PORT/emulator/v1/projects/PROJECT_ID/databases/(default)/documents

에뮬레이터에서 127.0.0.1:8080를 사용하지 않으면 호스트와 포트를 조정합니다. 코드는 삭제가 완료되거나 실패했다는 REST 확인을 기다려야 합니다.

curl을 사용하여 셸에서 이 작업을 수행할 수 있습니다.

$ curl -v -X DELETE "http://HOST:PORT/emulator/v1/projects/PROJECT_ID/databases/(default)/documents"

Firestore 에뮬레이터와 프로덕션 환경의 차이점

Firestore 에뮬레이터에서는 프로덕션 서비스의 동작을 충실하게 복제하려고 하지만 몇 가지 주요 제한사항이 있습니다.

트랜잭션

에뮬레이터는 프로덕션 환경에 보이는 모든 트랜잭션 동작을 구현하지는 않습니다. 한 문서에 여러 번의 동시 쓰기를 수반하는 기능을 테스트하는 경우 에뮬레이터에서 쓰기 요청을 완료하는 속도가 느릴 수 있습니다. 경우에 따라 잠금이 해제되는 데 최대 30초가 걸릴 수 있습니다. 필요한 경우 테스트 시간 제한을 조정해 보세요.

색인

에뮬레이터는 복합 색인을 추적하지 않으며 대신 유효한 쿼리를 실행합니다. 실제 Firestore 인스턴스에서 앱을 테스트하여 필요한 색인을 파악해야 합니다.

한도

에뮬레이터는 프로덕션에서 시행되는 모든 한도를 적용하지 않습니다. 예를 들어 프로덕션 서비스에서는 너무 커서 거부될 트랜잭션을 에뮬레이터는 허용할 수 있습니다. 문서화된 한도를 숙지하고 이러한 문제를 사전에 방지하도록 앱을 설계해야 합니다.