Firestore와 Realtime Database는 둘 다 Firebase에서 제공하는 데이터베이스 서비스지만, 설계 목적, 기능, 그리고 사용 사례에서 차이가 있다.
| 특징 | Firestore | Realtime Database |
|---|---|---|
| 데이터 모델 | 문서(Document) 기반의 NoSQL | 데이터베이스 트리(Tree) 구조 기반의 NoSQL 데이터베이스 |
| 데이터 구조 | 컬렉션(Collection) 안에 문서(Document)를 저장 | JSON 형식의 트리 구조로 데이터를 저장 |
| 실시간 데이터 | 지원 (다소 제한적) | 실시간 데이터 동기화에 최적화 |
| 쿼리 | 풍부한 쿼리 지원 (필터, 정렬, 복합 인덱스 등) | 기본적인 쿼리 기능만 지원 |
| 확장성 | 더 뛰어남 (수평적 확장 가능) | 확장성이 제한적 |
| 오프라인 지원 | 기본 제공 (자동 동기화 포함) | 기본 제공 (단순 동기화) |
| 사용 사례 | 복잡한 데이터 모델 및 다양한 쿼리 요구 | 간단한 데이터 모델 및 빠른 실시간 동기화 요구 |
데이터를 컬렉션(Collection)과 문서(Document)로 관리.
문서에는 필드와 하위 컬렉션이 포함될 수 있음.
users (Collection)
|
|-- user_id_123 (Document)
|-- name: "John"
|-- age: 30
|-- posts (Sub-Collection)
|-- post_id_1 (Document)
|-- title: "Hello World"
|-- content: "This is Firestore"
데이터를 트리(Tree) 구조로 관리.
JSON 형식으로 데이터를 저장하며, 계층 구조가 복잡해질수록 관리가 어려움.
{
"users": {
"user_id_123": {
"name": "John",
"age": 30,
"posts": {
"post_id_1": {
"title": "Hello World",
"content": "This is Realtime Database"
}
}
}
}
}
강력한 쿼리 기능 제공.
필터, 정렬, 복합 인덱스 지원.
users_ref.where("age", ">", 25).order_by("name").get()
기본적인 쿼리 기능만 제공.
제한된 정렬 및 필터링 가능.
db.reference('users').order_by_child('age').start_at(25).get()
실시간 동기화를 지원하지만, Realtime Database만큼 빠르지는 않음.
실시간 동기화가 필요한 데이터 변경이 적은 경우 적합.
빠르고 효율적인 실시간 동기화를 제공.
채팅 애플리케이션처럼 데이터 변경이 잦은 경우에 적합.
수평적 확장이 가능하며, 대규모 애플리케이션에 적합.
높은 읽기/쓰기 트래픽을 처리할 수 있음.
트리 구조로 인해 데이터가 많아지면 확장성에 한계가 있음.
트래픽이 많아질수록 성능 저하 가능.
읽기, 쓰기, 삭제 요청에 따라 요금 부과.
저장 공간과 네트워크 사용량 기반 요금.
저장된 데이터 크기와 네트워크 사용량 기반 요금.
실시간 동기화가 많을수록 비용 증가.
Firestore를 사용할 때
Realtime Database를 사용할 때
| 요구사항 | Firestore | Realtime Database |
|---|---|---|
| 데이터가 복잡하거나 쿼리가 필요한 경우 | ✅ | ❌ |
| 실시간 동기화가 필요한 경우 | ✅ | ✅ (더 적합) |
| 대규모 확장이 필요한 경우 | ✅ | ❌ |
| 단순한 데이터 모델이 필요한 경우 | ❌ | ✅ |