컬렉션과 문서 개념을 이해하고 데이터를 추가, 조회하며 문서 구조를 설계한다.
Firestore 기본
Firestore는 문서(document) 기반의 NoSQL 데이터베이스입니다. 테이블과 행 대신 컬렉션과 문서로 데이터를 구조화하며, JSON과 비슷한 형태로 값을 저장합니다. 이번 강의에서는 데이터를 추가하고 읽어오는 기본 동작과 문서 구조 설계를 배웁니다.
학습 목표
- 컬렉션과 문서의 개념을 이해한다.
addDoc과setDoc으로 데이터를 추가한다.getDoc과getDocs로 데이터를 조회한다.- 문서 구조를 합리적으로 설계한다.
컬렉션과 문서
Firestore의 데이터는 계층 구조입니다. 컬렉션은 문서들의 묶음이고, 각 문서는 필드(key-value)를 가집니다. 문서 안에 다시 하위 컬렉션을 둘 수도 있습니다.
users (컬렉션)
└─ user_123 (문서)
├─ name: "민지"
├─ email: "minji@example.com"
└─ posts (하위 컬렉션)
└─ post_1 (문서)
addDoc으로 추가
문서 ID를 Firestore가 자동 생성하게 하려면 addDoc을 씁니다. 게시글처럼 ID를 직접 정할 필요가 없을 때 적합합니다.
import { collection, addDoc, serverTimestamp } from 'firebase/firestore';
import { db } from '@/lib/firebase';
async function addPost(title: string, content: string) {
const ref = await addDoc(collection(db, 'posts'), {
title,
content,
createdAt: serverTimestamp(),
});
console.log('생성된 문서 ID:', ref.id);
}
setDoc으로 추가
문서 ID를 직접 지정하고 싶을 때는 setDoc을 씁니다. 사용자 UID를 문서 ID로 쓰는 경우가 대표적입니다.
import { doc, setDoc } from 'firebase/firestore';
import { db } from '@/lib/firebase';
async function saveUser(uid: string, name: string) {
await setDoc(doc(db, 'users', uid), {
name,
createdAt: serverTimestamp(),
});
}
💡 TIP —
setDoc에{ merge: true }옵션을 주면 기존 필드를 유지한 채 일부 필드만 갱신할 수 있습니다.
데이터 조회
단일 문서는 getDoc, 컬렉션 전체는 getDocs로 읽습니다. 문서가 존재하는지 항상 확인해야 합니다.
import { doc, getDoc, collection, getDocs } from 'firebase/firestore';
import { db } from '@/lib/firebase';
// 단일 문서
const snap = await getDoc(doc(db, 'users', 'user_123'));
if (snap.exists()) {
console.log(snap.data());
}
// 컬렉션 전체
const list = await getDocs(collection(db, 'posts'));
list.forEach((d) => console.log(d.id, d.data()));
⚠️ 주의 —
getDocs로 컬렉션 전체를 읽으면 문서 수만큼 읽기 비용이 발생합니다. 데이터가 많을 때는 다음 강의의 쿼리로 필요한 만큼만 가져오세요.
| 함수 | 대상 | 용도 |
|---|---|---|
| addDoc | 컬렉션 | 자동 ID로 추가 |
| setDoc | 문서 | 지정 ID로 추가/덮어쓰기 |
| getDoc | 문서 | 단일 문서 조회 |
| getDocs | 컬렉션 | 여러 문서 조회 |
요약
- Firestore는 컬렉션 → 문서 → 필드의 계층 구조를 가집니다.
- ID 자동 생성은
addDoc, ID 직접 지정은setDoc을 씁니다. getDoc은 단일 문서,getDocs는 컬렉션 조회에 사용합니다.- 단일 문서는
exists()로 존재 여부를 먼저 확인합니다. - 컬렉션 전체 읽기는 비용이 크므로 쿼리로 범위를 좁히는 것이 좋습니다.
연습문제
addDoc과setDoc의 가장 큰 차이는 무엇인가요?- 사용자 정보를 저장할 때 문서 ID로 무엇을 쓰는 것이 편리한가요?
getDoc으로 가져온 문서가 존재하는지 확인하는 메서드는 무엇인가요?setDoc에서 일부 필드만 갱신하려면 어떤 옵션을 주나요?
힌트 — 덮어쓰기와 병합의 차이를 떠올려 보세요.
💡 연습문제 풀이
불러오는 중…
댓글 0
“Firebase” 강좌에 대한 댓글입니다.