codingstairs
노트에듀라이프연락
⌕검색⌘K
koen

Navigation

  • Intro
  • Blog
  • Life

연락하기

로그인 없이도 보낼 수 있어요. 답변이 필요하면 이메일을 함께 적어 주세요.

  • 익명 폼으로 의견 남기기 →
  • ✉ warragon112@gmail.com
  • 카카오톡 오픈채팅 ↗

© 2026 codingstairs

  • 노트
  • 에듀
  • 검색
  • 라이프
  • 연락
  • 약관
  • RSS
  • GitHub
노트›cloud

Firebase Local Emulator Suite — Firebase 한 묶음을 노트북에

2026-04-28 게시· 2026-05-18 갱신·0회 조회

Firebase Local Emulator Suite — Firebase 한 묶음을 노트북에 띄우기

Firebase 는 2011 년 작은 스타트업으로 시작해 2014 년 Google 에 인수됐습니다. 매니지드 모델이 강한 서비스답게 한동안은 "로컬에서 띄우는 길이 없다" 가 맞는 답이었지만, 2020 년 3 월 Firebase Local Emulator Suite 가 정식 GA 되면서 그림이 바뀌었습니다.

1. Suite 에 대한 이야기

Firebase Local Emulator Suite 는 Firebase CLI (firebase-tools) 안에 들어 있는 로컬 에뮬레이터 묶음입니다. Java 가상머신 위에서 도는 9 개 에뮬레이터가 한 프로세스로 부팅되고, 단일 Web UI (디폴트 4000 포트) 에서 시각적으로 다 볼 수 있습니다.

에뮬레이터 디폴트 포트 흉내 대상
Authentication 9099 Firebase Auth (이메일·OAuth·OTP·MFA).
Cloud Firestore 8080 NoSQL 문서 DB.
Realtime Database 9000 JSON 트리 DB.
Cloud Storage 9199 객체 스토리지 (S3 비호환).
Cloud Functions 5001 서버리스 함수.
Cloud Pub/Sub 8085 메시지 큐.
Eventarc 9299 CloudEvents 라우팅.
Hosting 5000 정적 사이트.
Firebase Extensions (각자) 확장 패키지.

가장 중요한 사실 — FCM (Cloud Messaging) 은 이 목록에 없습니다. Firebase 가 공식적으로 emulator 미제공. 이유는 단순 — FCM 은 실제 디바이스 토큰과 Google 의 푸시 인프라를 거쳐야 동작하므로 시뮬레이션이 의미 없는 도메인입니다. 인터넷에 흔히 떠도는 "FCM emulator" 는 모두 비공식 wrapper 또는 HTTP mock.

2. 한 프로세스, 여러 포트

firebase emulators:start 한 번으로 전부 부팅. 각 에뮬레이터는 자체 포트에 listen. SDK 는 환경변수 (FIRESTORE_EMULATOR_HOST · FIREBASE_AUTH_EMULATOR_HOST) 가 있으면 자동으로 emulator 로 향하므로 코드 변경 0.

3. 데이터 영속성 · Web UI

기본은 메모리 — 종료 시 데이터 사라짐. --export-on-exit ./data + --import ./data 옵션을 쓰면 종료 시 export, 시작 시 import. 또는 emulator 캐시 디렉터리 자체를 볼륨 마운트.

Web UI (디폴트 4000 포트) — Authentication 탭에서 사용자를 직접 추가하면 즉시 ID 토큰 발급. Firestore 탭에선 문서를 직접 추가/수정/삭제. "API 호출 → DB 변경" 흐름 디버깅의 가장 빠른 길.

Firestore Security Rules — firestore.rules 파일을 마운트하면 emulator 안에서 그 규칙이 적용. SDK 호출이 거부되면 정확한 거부 사유가 로그에. 운영 배포 전에 규칙 회귀 테스트하는 표준 방법.

4. 호스트에서 직접

npm i -g firebase-tools
firebase init emulators
firebase emulators:start

firebase init emulators 가 firebase.json 의 emulator 섹션을 만듭니다. 어떤 emulator 를 활성화할지 인터랙티브하게 선택.

5. Docker 컨테이너

공식 Docker 이미지는 없고, 커뮤니티 이미지가 표준입니다.

services:
  firebase:
    image: andreysenov/firebase-tools:13.x
    user: node
    working_dir: /home/node
    command:
      - firebase
      - emulators:start
      - --project=demo
      - --only=auth,firestore,storage,functions
    ports:
      - "4400:4400"   # UI (디폴트 4000)
      - "9099:9099"   # Auth
      - "8085:8085"   # Firestore
    volumes:
      - ./firebase.json:/home/node/firebase.json:ro

이미지 500 MB. 첫 부팅 시 emulator JAR 다운로드 + Java 부팅으로 3060 초.

6. SDK 호출

Node.js (firebase-admin) — 환경변수만 잡으면 자동 분기:

export FIREBASE_AUTH_EMULATOR_HOST=localhost:9099
export FIRESTORE_EMULATOR_HOST=localhost:8085
export FIREBASE_STORAGE_EMULATOR_HOST=localhost:9199
export GOOGLE_CLOUD_PROJECT=demo
import { initializeApp } from "firebase-admin/app";
import { getFirestore } from "firebase-admin/firestore";

initializeApp({ projectId: "demo" });
await getFirestore().collection("users").add({ name: "테스트 사용자" });

Web 클라이언트 (firebase) — 환경변수 자동 인식이 안 되어 명시 호출:

import { initializeApp } from "firebase/app";
import { connectAuthEmulator, getAuth } from "firebase/auth";
import { connectFirestoreEmulator, getFirestore } from "firebase/firestore";

const app = initializeApp({ projectId: "demo", apiKey: "fake-api-key" });
connectAuthEmulator(getAuth(app), "http://localhost:9099");
connectFirestoreEmulator(getFirestore(app), "localhost", 8085);

7. 한계

FCM 없음 — 서버 측 송신 호출 검증은 WireMock 같은 HTTP mock 으로 별도.

Firebase Hosting 의 SSR — 일부 미지원. Functions 와의 연동 일부 제약.

Cloud Storage 의 다운로드 URL — emulator 가 발급하는 URL 이 운영과 형식이 다릅니다. URL 을 DB 에 저장해 두는 패턴은 환경 분기 필요.

Performance Monitoring · Crashlytics · Remote Config — emulator 가 아예 없습니다. 운영에서만 검증.

App Check · App Hosting — 부분 지원 또는 미지원. 공식 매트릭스 확인.

Java 의존 — 컨테이너 안에 JDK 가 들어 있어 이미지가 무겁습니다 (~500 MB+). 메모리도 ~500 MB.

단일 인스턴스 가정 — 하나의 PC 에서 한 번만. 팀 공유는 별도 호스트.

8. CI 에서 쓰기

- run: docker compose up -d firebase
- run: |
    until curl -sf http://localhost:4400 >/dev/null; do sleep 2; done
- run: pnpm test

테스트 시작 전 emulator ready 폴링이 핵심. 안 그러면 첫 호출이 ECONNREFUSED.

하고픈 말

Firebase Emulator Suite 는 9 개 중 FCM 만 빠진다는 점이 가장 자주 검색되는 함정입니다. 환경변수만 잡으면 SDK 가 자동 분기하므로 코드 변경 0. CI 에서 ready 폴링만 잘 처리하면 통합 테스트의 표준 채널이 됩니다.

Next

  • api-mocking-wiremock

Firebase Emulator Suite · Connect & Prototype · andreysenov/firebase-tools · FCM 공식 (emulator 미지원 명시) 를 참고합니다.

cloud 카테고리의 다른 글

카테고리 전체 보기 →
  • title 템플릿 단일 소스 — 자식 페이지가 박지 않게 한다
  • GitHub Pages — 저장소를 정적 사이트로
  • Replit — 브라우저 기반 개발·배포 통합 플랫폼
  • HTTP API Mocking — WireMock · MockServer · Prism · MSW
  • Supabase Self-Hosted — Postgres 한 통에 BaaS 를 담는 방법
  • LocalStack 과 MiniStack — 로컬에서 AWS 흉내내기