where, orderBy, limit로 데이터를 필터링하고 정렬하며 startAfter로 페이지네이션을 구현한다.
Firestore 쿼리
데이터가 많아지면 컬렉션 전체를 읽는 대신 필요한 문서만 골라 가져와야 합니다. Firestore는 where, orderBy, limit 같은 조건을 조합해 쿼리를 구성합니다. 이번 강의에서는 필터링, 정렬, 페이지네이션과 인덱스까지 다룹니다.
학습 목표
where로 조건에 맞는 문서만 가져온다.orderBy와limit로 정렬하고 개수를 제한한다.- 여러 조건을 조합한 복합 쿼리를 만든다.
startAfter로 페이지네이션을 구현하고 인덱스를 이해한다.
where로 필터링
query로 쿼리를 만들고 where로 조건을 추가합니다. 비교 연산자는 ==, >, <, >=, <=, in, array-contains 등을 지원합니다.
import { collection, query, where, getDocs } from 'firebase/firestore';
import { db } from '@/lib/firebase';
const q = query(
collection(db, 'posts'),
where('published', '==', true),
);
const snap = await getDocs(q);
snap.forEach((d) => console.log(d.data()));
orderBy와 limit
정렬은 orderBy, 개수 제한은 limit으로 합니다. 최신 글 10개를 가져오는 예시입니다.
import { collection, query, orderBy, limit, getDocs } from 'firebase/firestore';
import { db } from '@/lib/firebase';
const q = query(
collection(db, 'posts'),
orderBy('createdAt', 'desc'),
limit(10),
);
const snap = await getDocs(q);
복합 쿼리
여러 조건을 함께 쓸 수 있습니다. 다만 where로 범위 필터를 건 필드와 orderBy 필드가 다르면 복합 인덱스가 필요합니다.
const q = query(
collection(db, 'posts'),
where('category', '==', 'tech'),
where('published', '==', true),
orderBy('createdAt', 'desc'),
limit(20),
);
⚠️ 주의 — 복합 쿼리가 인덱스를 요구하면 실행이 실패하고 콘솔에 인덱스 생성 링크가 담긴 에러가 출력됩니다. 그 링크를 클릭하면 필요한 인덱스를 바로 만들 수 있습니다.
페이지네이션
startAfter에 마지막으로 읽은 문서 스냅샷을 넘기면 그다음부터 이어서 가져옵니다. "더 보기" 방식 구현에 적합합니다.
import {
collection, query, orderBy, limit, startAfter, getDocs,
} from 'firebase/firestore';
import { db } from '@/lib/firebase';
const first = await getDocs(
query(collection(db, 'posts'), orderBy('createdAt', 'desc'), limit(10)),
);
const lastDoc = first.docs[first.docs.length - 1];
const next = await getDocs(
query(
collection(db, 'posts'),
orderBy('createdAt', 'desc'),
startAfter(lastDoc),
limit(10),
),
);
💡 TIP —
startAfter에는 값(예: 타임스탬프)을 직접 넣을 수도 있지만, 문서 스냅샷을 넘기면 정렬 기준이 여러 개여도 정확히 이어집니다.
인덱스
단일 필드 인덱스는 Firestore가 자동으로 만들지만, 여러 필드를 조합한 복합 인덱스는 직접 정의해야 합니다.
| 쿼리 유형 | 인덱스 |
|---|---|
| 단일 필드 정렬/필터 | 자동 생성 |
| 여러 필드 복합 쿼리 | 복합 인덱스 필요 |
| 범위 필터 + 다른 필드 정렬 | 복합 인덱스 필요 |
요약
where로 조건 필터링,orderBy로 정렬,limit으로 개수를 제한합니다.- 여러 조건은
query안에 나열해 복합 쿼리를 만듭니다. - 복합 쿼리는 복합 인덱스가 필요할 수 있고, 에러 링크로 쉽게 생성합니다.
- 페이지네이션은 마지막 문서 스냅샷을
startAfter에 넘겨 구현합니다. - 단일 필드 인덱스는 자동, 복합 인덱스는 수동으로 만듭니다.
연습문제
- 조건에 맞는 문서만 가져오는 쿼리 함수는 무엇인가요?
- 최신 글 10개를 가져오려면 어떤 함수들을 조합해야 하나요?
- 복합 쿼리 실행 시 인덱스 에러가 나면 어떻게 해결하나요?
- 페이지네이션에서 다음 페이지를 가져올 때
startAfter에 무엇을 넘기는 것이 안전한가요?
힌트 — 정렬 기준이 여러 개일 때를 떠올려 보세요.
💡 연습문제 풀이
불러오는 중…
댓글 0
“Firebase” 강좌에 대한 댓글입니다.