Firestore 배포 중 인덱스 삭제 여부를 물으면 어떤 정의와 쿼리를 대조해야 하나요?
Firestore 인덱스 삭제 질문은 로컬 정의와 원격 상태의 차이를 정리할지 묻습니다. 사용 중인 쿼리에 필요한지 모르면 삭제하지 마세요. Console과 로컬 JSON의 필드·정렬을 대조해 필요한 정의를 보존하고 개발 쿼리를 확인합니다.
적용 조건·범위: 예를 들어 reviews에서 productId == 값, createdAt 내림차순을 사용하는 화면이 살아 있다면 아래 정의를 기존 indexes 배열에 병합합니다. 파일 전체를 예시 하나로 덮어쓰지 않습니다. Console에서 만든 인덱스가 코드에 누락된 경우 삭제보다 정의를 회수하는 것이 먼저입니다.
본문 근거: firebase.google.com/docs/firestore/query-data/indexing · firebase.google.com/docs/emulator-suite/connect_firestore
학습 목표와 사전 지식
목표: 인덱스 삭제 질문의 의미를 읽고 실행 중인 쿼리와 비교해 보존·삭제를 결정합니다.
사전 지식: firebase deploy, 복합 쿼리, 버전 관리
Would you like to delete these indexes?는 로컬 정의와 원격 인덱스 차이를 정리할지 묻는 질문입니다. 필요 여부를 모르면 N으로 보존하고 조사합니다. 문서는 지워지지 않아도 쿼리가 실패할 수 있습니다.
최소 재현 조건
개발 프로젝트 Console에 복합 인덱스를 만든 뒤 로컬 firestore.indexes.json에 그 정의가 없는 상태에서 인덱스 배포를 시도하면 삭제 후보가 표시될 수 있습니다. CLI 버전에 따라 문구가 다를 수 있습니다. 실제 운영 인덱스를 시험 삼아 삭제할 필요는 없습니다.
터미널 · 읽기 확인 명령; 출력의 대상 프로젝트와 정의를 로컬에서 비교
firebase --version
firebase use
firebase firestore:indexes --project YOUR_PROJECT_ID

수정 위치: firestore.indexes.json
예를 들어 reviews에서 productId == 값, createdAt 내림차순을 사용하는 화면이 살아 있다면 아래 정의를 기존 indexes 배열에 병합합니다. 파일 전체를 예시 하나로 덮어쓰지 않습니다. Console에서 만든 인덱스가 코드에 누락된 경우 삭제보다 정의를 회수하는 것이 먼저입니다.
firestore.indexes.json · 최소 파일 예시; 실제 파일에는 기존 정의를 보존
{
"indexes": [
{
"collectionGroup": "reviews",
"queryScope": "COLLECTION",
"fields": [
{
"fieldPath": "productId",
"order": "ASCENDING"
},
{
"fieldPath": "createdAt",
"order": "DESCENDING"
}
]
}
],
"fieldOverrides": []
}
| 판단 | 선택·조치 |
|---|---|
| 사용 중인 쿼리·관리자 화면·구버전 앱이 존재 | N, 원격 정의를 코드로 가져오기 |
| 참조 여부를 모름 | N, 호출 위치와 배포 버전 조사 |
| 모든 호출 제거와 롤백 영향 검토 완료 | 별도 변경으로 삭제 검토 |
조회 성공으로 확인해야 하는 이유
인덱스 생성은 빌드 시간이 필요합니다. 배포 명령 종료만으로 모든 쿼리가 준비됐다고 보지 말고 Console에서 준비 상태를 확인한 뒤 실제 복합 쿼리와 페이지네이션을 실행합니다. 에뮬레이터는 복합 인덱스 요구를 운영과 동일하게 강제하지 않으므로 이 확인은 개발용 실제 Firestore에서도 필요합니다.

삭제 후 문제라면
저장한 정의를 복원해 다시 배포하고 생성 완료까지 기다립니다. 재생성이 가능하다는 말은 즉시 복구를 뜻하지 않습니다. 삭제 후보·결정 이유·영향 쿼리·복원 파일을 함께 기록하면 다음 배포 때 같은 질문을 반복 조사하지 않아도 됩니다.
삭제 후보를 실제 쿼리에 연결하기
아래 조회가 운영 화면 또는 구버전 앱에서 살아 있다면 예시 복합 인덱스의 삭제 질문에 N을 선택할 이유가 있습니다. db는 해당 프로젝트로 초기화한 Firestore 인스턴스입니다. 쿼리 코드만 보고 인덱스가 운영에서 이미 준비됐다고 판단하지 마세요.
import { collection, getDocs, limit, orderBy, query, where } from 'firebase/firestore';
const recentReviews = query(
collection(db, 'reviews'),
where('productId', '==', 'demo'),
orderBy('createdAt', 'desc'),
limit(10),
);
const result = await getDocs(recentReviews);
console.log(result.docs.map((item) => item.id));
| 대조 항목 | 이 예제에서 확인할 값 |
|---|---|
| 대상 프로젝트·DB | firebase use의 대상과 실제 앱 설정이 같은지 |
| 컬렉션 범위 | 루트 reviews 컬렉션, JSON의 collectionGroup: reviews / queryScope: COLLECTION |
| 쿼리 제약 | productId 동등 조건, createdAt 내림차순, limit(10) |
| 호출자 | 현재 웹 화면뿐 아니라 구버전 앱·관리자 작업·예약 작업까지 조사 |
| 복원 근거 | 인덱스 JSON을 버전 관리하고 재생성 완료 전 쿼리 실패 가능성을 기록 |
인덱스 부족 오류의 Console 링크가 나오면 실제 필요한 정의를 확인하세요. 링크가 없거나 한 번 조회가 성공해도 다른 호출자가 없다는 뜻은 아닙니다. 삭제 후보를 모르면 N으로 보존하고 호출 위치를 찾으세요. 삭제를 결정할 때는 검색 결과와 배포·롤백 영향, 담당자 판단을 기록합니다. 이 편집에서는 실제 프로젝트의 인덱스나 쿼리를 조회·삭제하지 않았습니다.
직접 확인할 결과
원격 인덱스와 로컬 JSON 필드 순서 대조
실제 개발 DB 쿼리 확인
재생성 대기·롤백 계획 기록
검증 범위와 기준일
공식 문서 확인일: 2026-09-13. 웹 SDK 예제는 모듈형 API 기준입니다. 이 글의 코드·구조 정적 검토와 실제 클라우드 인증·저장·배포 검증을 구분합니다. 본인 개발 Firebase 프로젝트의 실제 인증·권한·배포 요청은 이 편집 환경에서 실행하지 않았습니다.
이어서 학습하기
- Firebase 배포 제외 파일 설정: firebase.json의 ignore 사용법
- Firebase Auth unauthorized-domain 오류 해결: 로그인 도메인 설정 확인
공식 문서
이 글이 도움이 되었나요?
읽음 기록
읽음 — / 전체 20개 · 필수 14개
새 글 받아보기
RSS 리더에서 BlogFlow의 새 글을 확인할 수 있습니다.