Firebase Firestore — NoSQL 문서 및 컬렉션 정의

저자: IT Sectr 게시일: 2026-04-28 읽는 시간: 10 분

Firebase Firestore는 모바일 및 웹 애플리케이션을 위한 자동 실시간 동기화 기능을 갖춘 Google의 유연한 NoSQL 문서 데이터베이스입니다. 데이터는 컬렉션과 문서로 저장되며, 각 문서는 임의 구조의 필드 집합을 포함합니다. Google, 2026에 따르면 Firestore는 자동 장애 복구를 통한 다중 지역 복제를 지원합니다. SDK는 100밀리초 미만의 지연 시간으로 WebSocket 연결을 통해 서버에 변경 사항을 전송합니다.

핵심 요점

  • Firestore는 쿼리, 인덱스 및 트랜잭션을 지원하는 NoSQL 문서 데이터베이스입니다.
  • 데이터 동기화는 WebSocket을 통해 실시간으로 작동하며, 서버의 변경 사항이 즉시 모든 클라이언트에 전달됩니다.
  • Firestore는 오프라인 모드를 지원합니다. 데이터는 로컬에 캐시되고 연결이 복원되면 동기화됩니다.
  • 샤딩 또는 복제를 구성하지 않고 수백만 개의 동시 연결로 자동 확장됩니다.
  • Security Rules를 사용하면 서버 측 코드 없이 데이터 액세스를 관리할 수 있습니다.

Firebase Firestore란

Firebase Firestore는 Google이 2019년 Realtime Database의 후속 제품으로 출시한 클라우드 NoSQL 데이터베이스입니다. Firestore는 Google Cloud Spanner 및 Google Cloud Datastore 인프라 위에 구축되어 단일 트랜잭션 내에서 강력한 데이터 일관성과 자동 다중 지역 복제를 제공합니다. SDK는 Android, iOS, Web(JavaScript), Flutter, Kotlin Multiplatform 및 Unity를 지원합니다.

Realtime Database에서의 진화

Firestore는 Google I/O 2017에서 “Cloud Firestore”로 발표되었으며, 이는 Realtime Database의 주요 제한 사항인 복잡한 쿼리 지원 부족, 여러 노드 간 데이터 확장 불가능, 약한 일관성을 해결하는 솔루션입니다. Google(2026)에 따르면 Firestore는 하루에 1조 개 이상의 요청을 처리하며 새로운 Firebase 프로젝트의 80%에서 기본 데이터베이스로 사용됩니다. 그러나 Realtime Database는 단순한 JSON 구조 덕분에 초저지연 시나리오(게임, 협업 편집)에서 여전히 중요합니다.

Firestore 무료 한도

Firestore는 Spark 요금제에서 넉넉한 무료 한도와 함께 종량제 모델로 제공됩니다: 스토리지 1GB, 월간 네트워크 트래픽 10GB, 일일 5만 회 읽기 작업, 2만 회 쓰기 작업, 2만 회 삭제 작업. Blaze 요금제에서는 위 모든 것이 무료이며 초과 사용 시 요금이 부과됩니다: 읽기 10만 회당 $0.06, 쓰기 10만 회당 $0.18. Google(2026)에 따르면 프로젝트의 90%가 무료 한도 내에 있습니다.

데이터 모델: 컬렉션, 문서 및 필드

Firestore의 데이터 모델은 계층적으로 구성됩니다: 루트에는 컬렉션이 있고, 각 컬렉션에는 문서가 있으며, 각 문서에는 필드(기본 타입, 배열, Map)와 중첩 컬렉션(하위 컬렉션)이 있습니다. 컬렉션의 중첩 깊이는 제한이 없지만 문서는 다른 문서를 직접 포함할 수 없으며 참조(Reference 타입)를 통해서만 가능합니다.

컬렉션 및 문서

컬렉션은 자동 생성 또는 사용자 정의 식별자가 있는 문서의 컨테이너입니다. 각 문서는 최대 1MiB 크기의 JSON 유사 객체입니다. 문서 필드는 문자열, 숫자, 부울 값, 배열, Map, 타임스탬프(Timestamp), 지리적 지점(GeoPoint) 및 다른 문서에 대한 참조(Reference)가 될 수 있습니다. 문서 크기는 모든 필드 이름을 포함하여 1MiB로 제한됩니다.

Firestore 필드 타입예시인덱싱
String“user@example.com”
Number42, 3.14
Booleantrue, false
Array[1, 2, 3]contains만
Map{“nested”: “value”}예(키별)
Timestamp2026-07-03T12:00:00Z
Referenceusers/user123

일괄 쓰기 및 트랜잭션

Firestore는 데이터베이스 수준에서 원자적 트랜잭션을 지원합니다. 트랜잭션은 여러 문서를 읽고 쓸 수 있으며 Commit은 모든 변경 사항을 원자적으로 적용하거나 아무것도 적용하지 않습니다. 트랜잭션당 최대 500개 작업, 제한 시간 60초입니다. 일괄 쓰기(Batch Write)는 읽기 단계 없이 비트랜잭션 원자적 쓰기 작업입니다. 트랜잭션은 금융 거래, 좌석 예약 및 재고 관리에 중요합니다.

Firestore와 Realtime Database 비교

Firestore와 Realtime Database 사이의 선택은 프로젝트 요구 사항에 따라 달라집니다. 두 데이터베이스 모두 Firebase 생태계의 일부이며 실시간 동기화를 제공하고 모든 플랫폼에서 사용할 수 있지만 데이터 모델, 확장 및 가격 책정에서 근본적으로 다릅니다.

주요 차이점

Realtime Database는 단일 JSON 트리에 데이터를 저장하며 단순한 구조에 편리하지만 3수준 이상의 중첩에서 확장이 어렵습니다. Firestore는 자동 샤딩을 갖춘 컬렉션-문서 모델을 사용하여 성능 저하 없이 수백만 개의 문서로 확장할 수 있습니다. Google(2026)에 따르면 Firestore는 속도 저하 없이 단일 컬렉션에 최대 1만 개의 동시 연결을 지원하며 Realtime Database는 단일 인스턴스에 최대 20만 개의 연결을 지원합니다.

가격 책정

Realtime Database는 전송된 데이터(다운로드된 바이트)와 동시 연결 수에 따라 청구됩니다. Firestore는 작업 수(읽기, 쓰기, 삭제)에 따라 청구됩니다. 빈번한 소규모 업데이트가 있는 애플리케이션(채팅, 알림)의 경우 Firestore가 일반적으로 비용 효율적이며 각 쓰기 작업은 데이터 크기에 관계없이 고정 가격입니다. 대량 데이터의 드문 읽기가 있는 애플리케이션의 경우 Realtime Database가 더 저렴할 수 있습니다.

Google 권장 사항(2026): 새 프로젝트의 기본 데이터베이스로 Firestore를 사용하고 최소 지연 시간(50ms 미만)과 평면 데이터 구조가 중요한 게임 및 애플리케이션에는 Realtime Database를 사용하세요. 두 데이터베이스는 동일한 프로젝트에서 동시에 작동할 수 있습니다.

Firestore 쿼리, 인덱스 및 페이지네이션

Firestore 쿼리는 필터링, 정렬 및 제한과 함께 컬렉션 또는 컬렉션 그룹에 대해 실행됩니다. 각 쿼리가 클라이언트 측 필터링으로 전체 JSON 트리를 순회하는 Realtime Database와 달리 Firestore는 사전 생성된 인덱스를 사용하여 서버에서 모든 쿼리를 실행합니다. 이는 쿼리 복잡성이 컬렉션 크기가 아닌 결과 크기에만 의존함을 보장합니다.

쿼리 유형

Firestore는 하나 이상의 필드별 필터링(같음, 범위, in, array-contains, array-contains-any), 오름차순 및 내림차순 정렬, 제한 및 페이지네이션을 위한 커서를 지원합니다. 제한 사항: 다른 필드에 대한 필터링이 있는 복합 쿼리(where price > 10 AND where category == “books”)에는 복합 인덱스가 필요합니다. OR 쿼리는 금지되며(대신 in 및 array-contains-any 사용) 다른 필드에 대한 부등호 쿼리는 허용되지 않습니다.

kotlin
data class Product(
    val name: String = "",
    val category: String = "",
    val price: Double = 0.0,
    val inStock: Boolean = false
)

suspend fun FirestoreRepository.queryProducts(): List<Product> {
    return firestore
        .collection("products")
        .whereEqualTo("category", "electronics")
        .whereGreaterThanOrEqualTo("price", 100.0)
        .whereLessThan("price", 500.0)
        .orderBy("price")
        .limit(20)
        .get()
        .await()
        .toObjects(Product::class.java)
}

자동 및 복합 인덱스

Firestore는 단일 필드에 대한 인덱스를 자동으로 생성합니다. 단일 필드 쿼리는 구성 없이 작동합니다. 두 개 이상의 필드가 있는 쿼리(필터링 + 정렬)에는 복합 인덱스가 필요합니다. 쿼리가 처음 전송되면 Firestore는 한 번의 클릭으로 인덱스를 생성할 수 있는 콘솔 링크와 함께 오류를 반환합니다. 데이터베이스당 최대 200개의 복합 인덱스. 인덱스는 Firebase CLI를 통해 내보내고 가져올 수 있습니다.

Android에 Firestore 통합

Android 앱에 Firestore 연결은 Firebase BOM을 통해 표준 방식으로 수행됩니다. firebase-firestore-ktx 종속성을 추가한 후 FirebaseFirestore 객체는 getInstance()를 통해 사용할 수 있으며 추가 키나 토큰이 필요하지 않습니다. Firestore는 다른 서비스와 동일한 Firebase 프로젝트를 사용합니다.

groovy
dependencies {
    implementation(platform("com.google.firebase:firebase-bom:33.1.0"))
    implementation("com.google.firebase:firebase-firestore-ktx")
}

// 초기화
val db = FirebaseFirestore.getInstance()

데이터 읽기 및 쓰기

Firestore는 일회성(get)과 실시간(addSnapshotListener)의 두 가지 읽기 모드를 제공합니다. 일회성 읽기는 문서를 한 번 검색하며 설정 및 구성에 유용합니다. 리스너는 변경 사항을 구독하며 문서 업데이트 시 자동으로 모든 연결된 클라이언트에 실시간으로 업데이트된 데이터를 전달합니다. set()은 문서를 생성하거나 덮어쓰고 update()는 전체 문서를 덮어쓰지 않고 지정된 필드만 수정합니다.

Google(2026)에 따르면 실시간 Firestore를 사용하는 중간 규모 애플리케이션(10만 DAU)은 월간 약 5-10GB의 발신 트래픽을 소비합니다. 오프라인 캐시(Persistence Cache)를 사용하면 연결이 복원될 때 SDK가 변경된 문서만 로드하므로 반복 다운로드가 60-70% 감소합니다.

오프라인 모드

Persistence Cache는 인터넷 액세스 없이 작업하기 위한 Firestore의 내장 메커니즘입니다. SDK는 읽힌 모든 문서를 기기에 자동으로 캐시합니다(Android에서 최대 500MiB). 연결이 끊어지면 캐시에서 읽기가 계속되고 쓰기는 대기열에 추가됩니다. 연결이 복원되면 모든 보류 중인 작업이 서버로 전송되고 캐시가 서버와 동기화됩니다. 충돌 제어를 위해 snapshot-metadata.hasPendingWrites 및 setOptions(ServerTimestampBehavior)를 사용하세요.

보안 규칙 및 데이터 검증

Security Rules는 각 읽기 또는 쓰기 작업 전에 Google 서버에서 실행되는 Firestore의 선언적 액세스 제어 언어입니다. Rules는 서버 측 코드가 필요하지 않으며 Firebase 콘솔 또는 Firebase CLI를 통해 작성되고 Git을 통해 버전 관리됩니다. 각 작업은 규칙에 대해 확인되며 위반 시 PERMISSION_DENIED 오류가 반환됩니다.

규칙 구조

Firestore Security Rules는 match 블록과 allow 표현식으로 구성됩니다. match는 컬렉션 또는 문서의 경로를 정의하고 allow는 허용된 작업(read, write, create, update, delete)과 조건(부울 값을 반환하는 JavaScript 유사 표현식)을 지정합니다. 규칙은 인증(request.auth), 요청 데이터(request.resource.data), 기존 데이터(resource.data), 시간(request.time) 및 경로(request.path)를 확인할 수 있습니다.

javascript
rules_version = '2';

service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{userId} {
      allow read: if request.auth != null;
      allow write: if request.auth.uid == userId;
    }

    match /products/{productId} {
      allow read: if true;
      allow create: if request.auth.token.role == "admin";
      allow update: if resource.data.authorId == request.auth.uid;
    }
  }
}

데이터 검증

Security Rules는 서버 측에서 타입 및 값 검증을 지원합니다. 가격이 음수이거나 이름이 비어 있는 경우 쓰기를 금지할 수 있습니다. 모든 검사는 쓰기 전에 Google 서버에서 수행되며 클라이언트(Android, iOS, Web, Admin SDK)에 관계없이 데이터 일관성을 보장합니다. Rules는 악의적인 Admin SDK로부터 보호하지 않습니다. 설계상 규칙을 우회하기 때문입니다. 완전한 보호를 위해 Transaction Functions 및 Firebase Extensions를 사용하세요.

자주 묻는 질문

Firestore와 Realtime Database의 차이점은 무엇인가요?

Firestore는 인덱스와 복잡한 쿼리를 갖춘 문서 모델을 사용합니다. Realtime Database는 JSON 트리에 데이터를 저장하고 더 낮은 지연 시간을 제공합니다. Firestore가 새 프로젝트에 권장됩니다.

Firestore는 어떻게 확장되나요?

Firestore는 컬렉션 간에 데이터를 자동으로 샤딩합니다. 복제 또는 샤딩을 구성할 필요가 없습니다. 데이터베이스는 성능 저하 없이 컬렉션 내 수백만 개의 문서와 수천 개의 동시 연결을 처리합니다.

Realtime Database에서 Firestore로 데이터를 마이그레이션할 수 있나요?

네, Firebase Console의 “Export to Firestore” 기능을 사용하면 몇 번의 클릭으로 Realtime Database의 JSON 구조를 Firestore 컬렉션 및 문서로 변환할 수 있습니다. 중첩된 노드는 중첩된 컬렉션이 됩니다.

Firestore는 오프라인 쓰기 중 충돌을 어떻게 처리하나요?

Last write wins — 기본적으로 Firestore는 동시 쓰기 중 충돌을 해결하기 위해 “마지막 쓰기 승리” 정책을 사용합니다. 사용자 정의 처리를 위해 다시 읽기가 포함된 트랜잭션을 사용하세요.

Firestore는 얼마나 많은 무료 스토리지를 제공하나요?

Spark 요금제의 무료 한도: 스토리지 1GB, 일일 5만 회 읽기 작업 및 2만 회 쓰기 작업. 이는 MVP 및 트래픽이 적은 애플리케이션에 충분합니다.

요약

  • Firebase Firestore는 실시간 동기화 및 자동 확장을 갖춘 Google의 NoSQL 문서 데이터베이스입니다.
  • 데이터 모델: 컬렉션 → 문서 → 필드(String, Number, Boolean, Array, Map, Timestamp, Reference, GeoPoint).
  • 복잡한 조건에 대한 필터링, 정렬, 페이지네이션 및 복합 인덱스를 갖춘 복합 쿼리를 지원합니다.
  • 오프라인 모드는 연결 복원 시 자동 동기화와 함께 기기에 최대 500MiB의 데이터를 캐시합니다.
  • Security Rules — 백엔드 코드 없이 타입 및 값 검증이 가능한 서버 측 액세스 제어 언어.
  • 자동 장애 복구를 통한 다중 지역 복제 — 데이터 센터 중단 시에도 데이터 사용 가능.
  • 기본 데이터베이스로 새 프로젝트에 권장, 게임 및 초저지연 시나리오에는 Realtime Database.

턴키 방식의 모바일 애플리케이션을 개발해 드립니다

IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.

프로젝트 논의

더 읽어보기