dev.syw

컬렉션과 문서 개념을 이해하고 데이터를 추가, 조회하며 문서 구조를 설계한다.

Firestore 기본

Firestore는 문서(document) 기반의 NoSQL 데이터베이스입니다. 테이블과 행 대신 컬렉션과 문서로 데이터를 구조화하며, JSON과 비슷한 형태로 값을 저장합니다. 이번 강의에서는 데이터를 추가하고 읽어오는 기본 동작과 문서 구조 설계를 배웁니다.

학습 목표

  • 컬렉션과 문서의 개념을 이해한다.
  • addDocsetDoc으로 데이터를 추가한다.
  • getDocgetDocs로 데이터를 조회한다.
  • 문서 구조를 합리적으로 설계한다.

컬렉션과 문서

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(),
  });
}

💡 TIPsetDoc{ 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()로 존재 여부를 먼저 확인합니다.
  • 컬렉션 전체 읽기는 비용이 크므로 쿼리로 범위를 좁히는 것이 좋습니다.

연습문제

  1. addDocsetDoc의 가장 큰 차이는 무엇인가요?
  2. 사용자 정보를 저장할 때 문서 ID로 무엇을 쓰는 것이 편리한가요?
  3. getDoc으로 가져온 문서가 존재하는지 확인하는 메서드는 무엇인가요?
  4. setDoc에서 일부 필드만 갱신하려면 어떤 옵션을 주나요?

힌트 — 덮어쓰기와 병합의 차이를 떠올려 보세요.

💡 연습문제 풀이

불러오는 중…

함께 보면 좋은 자료

댓글 0

Firebase” 강좌에 대한 댓글입니다.

댓글을 작성하려면 로그인이 필요합니다.