Firebase Realtime Database는 Google의 클라우드 호스팅 NoSQL JSON 데이터베이스로, 실시간 동기화가 핵심 기능이다. 모든 클라이언트가 하나의 JSON 트리를 공유하며, 데이터 변경이 즉시 전파된다.
데이터 구조 설계
json
// Firebase RTDB는 하나의 거대한 JSON 트리
{
"users": {
"uid123": {
"name": "홍길동",
"email": "hong@example.com",
"lastSeen": 1704067200000
}
},
"messages": {
"chatRoom1": {
"msg001": {
"sender": "uid123",
"text": "안녕하세요",
"timestamp": 1704067200000
}
}
}
}
실시간 리스너 (Web SDK)
javascript
import { initializeApp } from 'firebase/app';
import { getDatabase, ref, onValue, push, set, query, orderByChild, limitToLast } from 'firebase/database';
const app = initializeApp({ databaseURL: 'https://my-app.firebaseio.com' });
const db = getDatabase(app);
// 실시간 데이터 수신 (변경 시 자동 호출)
const messagesRef = ref(db, 'messages/chatRoom1');
const recentQuery = query(messagesRef, orderByChild('timestamp'), limitToLast(50));
onValue(recentQuery, (snapshot) => {
const messages = [];
snapshot.forEach((child) => {
messages.push({ id: child.key, ...child.val() });
});
renderMessages(messages);
});
// 메시지 전송
async function sendMessage(text) {
const newMsgRef = push(ref(db, 'messages/chatRoom1'));
await set(newMsgRef, {
sender: 'uid123',
text,
timestamp: Date.now()
});
}
보안 규칙 (Security Rules)
json
{
"rules": {
"users": {
"$uid": {
".read": "$uid === auth.uid",
".write": "$uid === auth.uid"
}
},
"messages": {
"$roomId": {
".read": "auth != null",
".write": "auth != null",
"$messageId": {
".validate": "newData.hasChildren(['sender','text','timestamp']) && newData.child('sender').val() === auth.uid"
}
}
}
}
}
Firebase RTDB vs Firestore 비교
| 항목 | Realtime Database | Firestore |
|---|
| 데이터 모델 | JSON 트리 | 컬렉션/문서 |
| 쿼리 | 단일 정렬/필터 | 복합 쿼리 |
| 오프라인 | Web: X, Mobile: O | Web+Mobile: O |
| 가격 | 연결 수 + 다운로드 | 읽기/쓰기 건수 |
| 실시간 | 낮은 지연 | 낮은 지연 |
관련 문서