CI/CD에 Data Connect 에뮬레이터 사용

Firebase Data Connect는 엔드 투 엔드 프로토타입 제작과 지속적 통합 및 지속적 배포(CI/CD) 흐름을 위한 로컬 에뮬레이터를 제공합니다.

  • Data Connect 에뮬레이터는 로컬 통합 PGLite 데이터베이스 인스턴스와 상호작용하여 쿼리 및 변형의 프로토타입을 만들고 완전히 로컬 환경에서 클라이언트 코드를 테스트할 수 있도록 합니다.
  • Data Connect 에뮬레이터는 비대화형 작업에도 사용할 수 있습니다. 이를 통해 자동 테스트를 실행할 수 있으며 CI/CD 워크플로와 함께 사용하기에 적합합니다. 이는 스키마가 안정적이고 클라이언트 측 코드의 프로토타입을 만들고 테스트하려는 경우에 유용합니다.

이 가이드에서는 빠른 시작보다 에뮬레이터의 설치 및 사용에 관해 자세히 설명합니다.

Data Connect 에뮬레이터 설치

Data Connect 에뮬레이터를 사용하기 위해 Local Emulator Suite를 설치하려면 다음이 필요합니다.

  • Node.js 버전 18.0 이상

Firebase CLI 설치 및 프로젝트 디렉터리 설정

Firebase Data Connect
  1. 설치 가이드에 따라 Firebase CLI를 설치합니다. Data Connect 에뮬레이터는 버그 수정 및 새로운 기능을 포함하여 활발하게 개발 중이므로 정기적으로 업데이트해야 합니다.

  2. 아직 초기화하지 않았다면 메시지에 따라 사용할 제품을 지정하여 현재 작업 디렉터리를 Firebase 프로젝트로 초기화합니다.

    firebase init

Local Emulator Suite 구성 설정 또는 수정

Firebase VS Code 확장 프로그램에서 Data Connect 에뮬레이터를 시작한 경우 필요한 경우 에뮬레이터가 자동으로 설치되었습니다.

Firebase CLI를 사용하여 Local Emulator Suite의 선택된 다른 구성요소와 함께 에뮬레이터를 수동으로 설치할 수 있습니다. 이 명령어는 원하는 에뮬레이터를 선택하고 해당 에뮬레이터 바이너리 파일을 다운로드하며 기본값이 적절하지 않은 경우 에뮬레이터 포트를 설정할 수 있는 구성 마법사를 시작합니다.

  firebase init emulators

에뮬레이터가 설치되면 Firebase CLI 버전을 업데이트할 때까지 업데이트 확인이 수행되지 않으며 자동 다운로드가 추가로 진행되지 않습니다.

Firebase 프로젝트 선택

설정 흐름에서 Firebase CLI에 Firebase 프로젝트를 선택하거나 만들라는 메시지가 표시됩니다. Firebase 콘솔에서 Data Connect로 설정한 기존 프로젝트를 선택하면 여기에서 선택한 구성이 제안됩니다.

에뮬레이터 설정

에뮬레이터 구성

firebase init 흐름을 실행하면 에뮬레이터 설정 옵션이 안내됩니다. Local Emulator Suite의 다른 에뮬레이터와 마찬가지로 구성 매개변수는 로컬 프로젝트 파일에 저장됩니다.

  • firebase.json 파일에 에뮬레이터 포트 할당이 포함되어 있습니다.
    • emulators:ui 키는 Data Connect 에뮬레이터에는 적용되지 않습니다.

로컬 및 프로덕션 Data Connect 리소스 사용

프로덕션 리소스에 영향을 미치지 않으려면 demo- 프로젝트 ID를 설정하거나 나중에 설명하는 대로 클라이언트 코드가 에뮬레이터에 연결되도록 계측해야 합니다.

에뮬레이터 시작

CI/CD 워크플로와 같이 대화형이 아닌 방식으로 에뮬레이터를 실행하는 경우 exec 옵션으로 시작합니다.

firebase emulators:exec ./path/to/test-script.sh

사전 정의된 쿼리와 변형을 클라이언트 코드에 통합하고 특히 클라이언트 테스트용으로 에뮬레이터를 사용하는 경우 대화형 작업에 start 옵션을 사용할 수 있습니다. VS Code 확장 프로그램에서 에뮬레이터를 시작할 수도 있습니다.

firebase emulators:start

에뮬레이터와 통신하도록 클라이언트 코드 구현

Data Connect 에뮬레이터와 상호작용하도록 인앱 구성 또는 테스트 클래스를 다음과 같이 설정합니다.

자바스크립트
import { initializeApp } from "firebase/app";
import { connectorConfig } from "@name-of-package";
import { connectDataConnectEmulator, getDataConnect } from 'firebase/data-connect';

// TODO: Replace the following with your app's Firebase project configuration
const firebaseConfig = {
  //...
};

const app = initializeApp(firebaseConfig);

const dataConnect = getDataConnect(app, connectorConfig);
connectDataConnectEmulator(dataConnect, "localhost", 9399);

// Make calls from your app
  
Kotlin Android
val connector = MoviesConnector.instance

// Connect to the emulator on "10.0.2.2:9399"
connector.dataConnect.useEmulator()

// (Alternatively) if you're running your emulator on non-default port:
connector.dataConnect.useEmulator(port = 9999)

// Make calls from your app
  
iOS
let connector = DataConnect.dataConnect(DefaultConnectorClient.connectorConfig)

// Connect to the emulator on "127.0.0.1:9399"
connector.useEmulator()

// (alternatively) if you're running your emulator on non-default port:
connector.useEmulator(port: 9999)

// Make calls from your app
  

테스트 및 지속적 통합에 에뮬레이터 사용

컨테이너화된 Local Emulator Suite 이미지 실행

일반적인 CI 설정에서 컨테이너를 사용하여 Local Emulator Suite를 설치하고 구성하는 방법은 간단합니다.

다음과 같은 몇 가지 문제가 있습니다.

  • 에뮬레이터 바이너리는 ~/.cache/firebase/emulators/에 설치되고 캐시됩니다. 이 경로를 CI 캐시 구성에 추가하여 반복 다운로드를 방지할 수 있습니다.
  • 저장소에 firebase.json 파일이 없는 경우 emulators:start 또는 emulators:exec 명령어에 명령줄 인수를 추가하여 시작할 에뮬레이터를 지정해야 합니다. 예를 들면 --only dataconnect입니다.

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

실행 간에 테스트 환경을 재설정하려면 다음을 권장합니다.

  • 다음을 처리하는 전용 변형을 작성합니다.
    • 설정에서 로컬 데이터베이스 인스턴스를 시작 데이터로 채웁니다.
    • 런타임 종료 시 테스트 후 데이터베이스 인스턴스에서 수정된 데이터를 삭제합니다.

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

Data Connect 에뮬레이터는 서버 측 제품의 여러 기능을 시뮬레이션합니다. 하지만 다음과 같은 예외가 있습니다.

  • PGLite의 버전 및 세부 구성은 프로덕션 Cloud SQL 인스턴스의 버전과 다를 수 있습니다.
  • 에뮬레이터를 사용하여 Data Connect의 pgvector 및 Vertex API 통합으로 개발하는 경우 Cloud Vertex API 호출은 Cloud SQL의 Vertex 통합을 통해서가 아니라 직접 이루어집니다. 하지만 프로덕션 API 호출은 계속 이루어집니다. 즉, 실제 Firebase 프로젝트를 사용해야 하며 demo- 프로젝트는 사용할 수 없으며 Vertex API 비용이 발생합니다.