실시간 데이터베이스 에뮬레이터에 앱 연결

앱을 실시간 데이터베이스 에뮬레이터에 연결하기 전에 전반적인 Firebase 로컬 에뮬레이터 도구 모음 워크플로를 이해하고 로컬 에뮬레이터 도구 모음을 설치 및 구성하며 CLI 명령어를 검토해야 합니다.

Firebase 프로젝트 선택

Firebase 로컬 에뮬레이터 도구 모음은 단일 Firebase 프로젝트의 제품을 에뮬레이션합니다.

에뮬레이터를 시작하기 전에 사용할 프로젝트를 선택하려면 CLI로 작업 디렉터리에서 firebase use를 실행합니다. 또는 --project 플래그를 각 에뮬레이터 명령어에 전달합니다.

로컬 에뮬레이터 도구 모음은 실제 Firebase 프로젝트 및 데모 프로젝트의 에뮬레이션을 지원합니다.

프로젝트 유형 특징 에뮬레이터와 함께 사용
실제

실제 Firebase 프로젝트는 주로 Firebase Console을 통해 만들고 구성한 프로젝트입니다.

실제 프로젝트에는 데이터베이스 인스턴스, 스토리지 버킷, 함수 또는 해당 Firebase 프로젝트에 설정한 기타 리소스와 같은 라이브 리소스가 있습니다.

실제 Firebase 프로젝트로 작업할 때는 지원되는 제품 일부 또는 전부를 에뮬레이션할 수 있습니다.

에뮬레이션하지 않는 제품의 경우 앱과 코드가 데이터베이스 인스턴스, 스토리지 버킷, 함수 등 라이브 리소스와 상호작용합니다.

데모

데모 Firebase 프로젝트에는 실제 Firebase 구성이 없으며 라이브 리소스도 없습니다. 이러한 프로젝트는 일반적으로 Codelab 또는 기타 튜토리얼을 통해 액세스합니다.

데모 프로젝트의 프로젝트 ID에는 demo- 프리픽스가 있습니다.

데모 Firebase 프로젝트로 작업할 때는 앱과 코드가 에뮬레이터와 상호작용합니다. 앱이 에뮬레이터에서 실행 중이지 않은 리소스와 상호작용하려고 하면 코드가 실패합니다.

가능한 한 데모 프로젝트를 사용하는 것이 좋습니다. 장점은 다음과 같습니다.

  • 손쉬운 설정: Firebase 프로젝트를 만들지 않고도 에뮬레이터를 실행할 수 있습니다.
  • 강력한 안전성: 코드에서 실수로 에뮬레이션되지 않은(프로덕션) 리소스를 호출하더라도 데이터 변경, 사용, 청구 등이 발생할 가능성이 없습니다.
  • 오프라인 지원 향상: SDK 구성을 다운로드하기 위해 인터넷에 액세스할 필요가 없습니다.

에뮬레이터와 통신하도록 앱 구현

Android, Apple 플랫폼, 웹 SDK

실시간 데이터베이스와 상호작용하도록 인앱 구성 또는 테스트 클래스를 다음과 같이 설정합니다.

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 database = Firebase.database
database.useEmulator("10.0.2.2", 9000)
Java
// 10.0.2.2 is the special IP address to connect to the 'localhost' of
// the host computer from an Android emulator.
FirebaseDatabase database = FirebaseDatabase.getInstance();
database.useEmulator("10.0.2.2", 9000);
Swift
    // In almost all cases the ns (namespace) is your project ID.
let db = Database.database(url:"http://127.0.0.1:9000?ns=YOUR_DATABASE_NAMESPACE")

웹 모듈식 API

import { getDatabase, connectDatabaseEmulator } from "firebase/database";

const db = getDatabase();
if (location.hostname === "localhost") {
  // Point to the RTDB emulator running on localhost.
  connectDatabaseEmulator(db, "127.0.0.1", 9000);
} 

웹 네임스페이스화된 API

var db = firebase.database();
if (location.hostname === "localhost") {
  // Point to the RTDB emulator running on localhost.
  db.useEmulator("127.0.0.1", 9000);
} 

에뮬레이터를 사용하여 실시간 데이터베이스 이벤트에 의해 트리거되는 Cloud Functions를 테스트할 때는 추가 설정이 필요하지 않습니다. 실시간 데이터베이스와 Cloud Functions 에뮬레이터가 모두 실행되면 자동으로 함께 작동합니다.

Admin SDK

FIREBASE_DATABASE_EMULATOR_HOST 환경 변수가 설정되면 Firebase Admin SDK가 실시간 데이터베이스 에뮬레이터에 자동으로 연결됩니다.

export FIREBASE_DATABASE_EMULATOR_HOST="127.0.0.1:9000"

코드가 Cloud Functions 에뮬레이터 내에서 실행 중인 경우 initializeApp을 호출하면 프로젝트 ID 및 기타 구성이 자동으로 설정됩니다.

Admin SDK 코드를 다른 환경에서 실행되는 공유 에뮬레이터에 연결하려면 Firebase CLI를 사용하여 설정한 것과 동일한 프로젝트 ID를 지정해야 합니다. 프로젝트 ID를 initializeApp에 직접 전달하거나 GCLOUD_PROJECT 환경 변수를 설정할 수 있습니다.

Node.js Admin SDK
admin.initializeApp({ projectId: "your-project-id" });
환경 변수
export GCLOUD_PROJECT="your-project-id"

테스트 간 데이터베이스 삭제

활동 간에 실시간 데이터베이스를 삭제하려면 데이터베이스 참조를 지웁니다. 에뮬레이터 프로세스를 종료하는 대신 이 방법을 사용할 수 있습니다.

Kotlin+KTX
// With a DatabaseReference, write null to clear the database.
database.reference.setValue(null)
Java
// With a DatabaseReference, write null to clear the database.
database.getReference().setValue(null);
Swift
// With a DatabaseReference, write nil to clear the database.
    Database.database().reference().setValue(nil);

웹 모듈식 API

import { getDatabase, ref, set } from "firebase/database";

// With a database Reference, write null to clear the database.
const db = getDatabase();
set(ref(db), null);

웹 네임스페이스화된 API

// With a database Reference, write null to clear the database.
firebase.database().ref().set(null);

코드에서는 일반적으로 플랫폼의 비동기 이벤트 처리 기능을 사용하여 삭제가 완료되거나 실패했음을 확인할 때까지 기다립니다.

이와 같은 단계를 구현하면 실행 간에 이전 데이터가 삭제되고 새로운 기준 테스트 구성을 사용한다는 확신을 가지고 테스트 순서를 지정하고 함수를 트리거할 수 있습니다.

데이터 가져오기 및 내보내기

데이터베이스 에뮬레이터와 Firebase용 Cloud Storage 에뮬레이터를 사용하면 실행 중인 에뮬레이터 인스턴스에서 데이터를 내보낼 수 있습니다. 단위 테스트 또는 지속적 통합 워크플로에 사용할 기준 데이터 세트를 정의한 다음 내보내기하여 팀과 공유할 수 있습니다.

firebase emulators:export ./dir

테스트에서 에뮬레이터 시작 시 기준 데이터를 가져옵니다.

firebase emulators:start --import=./dir

내보내기 경로를 지정하거나 --import 플래그에 전달된 경로를 사용하여 종료 시 에뮬레이터가 데이터를 내보내도록 지시할 수 있습니다.

firebase emulators:start --import=./dir --export-on-exit

이러한 데이터 가져오기 및 내보내기 옵션은 firebase emulators:exec 명령어에서도 작동합니다. 자세한 내용은 에뮬레이터 명령어 참조를 확인하세요.

보안 규칙 활동 시각화

프로토타입과 테스트 루프를 진행하면서 로컬 에뮬레이터 도구 모음에서 제공하는 시각화 도구와 보고서를 사용할 수 있습니다.

규칙 평가 시각화

프로토타입에 보안 규칙을 추가하면 로컬 에뮬레이터 도구 모음을 사용하여 디버깅할 수 있습니다.

일련의 테스트를 실행한 후 각 규칙이 평가되는 방식을 보여주는 테스트 범위 보고서에 액세스할 수 있습니다. 이 보고서를 가져오려면 실행 중 에뮬레이터에서 노출된 엔드포인트를 쿼리하세요. 브라우저 버전에서는 다음 URL을 사용하세요.

http://localhost:9000/.inspect/coverage?ns=<database_name>

이렇게 하면 규칙이 표현식과 하위 표현식으로 구분되며, 마우스 오버하면 실행 횟수 및 반환된 값을 비롯한 자세한 정보를 볼 수 있습니다. 이 데이터의 원시 JSON 버전에서는 쿼리에 다음 URL을 포함하세요.

http://localhost:9000/.inspect/coverage.json?ns=<database_name>

다음 단계