Firestore CRUD 핵심 메서드 정리
구분기능Firestore 메서드예시 코드설명
| Create | 데이터 추가 | .add() / .set() | db.collection('Todos').add(data) | 문서를 생성하고 ID를 자동 발급받음 |
| Read | 데이터 조회 | .get() / .snapshots() | db.collection('Todos').get() | 모든 문서를 읽어옴 |
| Update | 데이터 수정 | .update() / .set(merge: true) | db.collection('Todos').doc(id).update(data) | 특정 필드 수정 |
| Delete | 데이터 삭제 | .delete() | db.collection('Todos').doc(id).delete() | 문서 전체 삭제 |
정리 문장:
Firestore는 .add(), .get(), .update(), .delete() 4개의 기본 메서드로 모든 CRUD를 처리한다.
Repository 설계
class ToDoRepository { final db = FirebaseFirestore.instance; Future<void> addToDo(ToDoModel toDo) async { await db.collection('Todos').add(toDo.toJson()); } Future<List<ToDoModel>> getToDos() async { final querySnapshot = await db.collection('Todos').get(); return querySnapshot.docs.map((doc) => ToDoModel.fromJson(doc.data())).toList(); } Future<void> updateToDo(ToDoModel toDo) async { await db.collection('Todos').doc(toDo.id).update(toDo.toJson()); } Future<void> deleteToDo(String id) async { await db.collection('Todos').doc(id).delete(); } }
핵심 포인트
- Firestore 인스턴스: FirebaseFirestore.instance
- 컬렉션은 고정: db.collection('Todos')
- 문서 ID는 .doc(id)로 접근
- CRUD 기능별 Firestore 메서드로 연결
예외처리 (try–catch) 적용 이유
이유설명
| 안정성 | 네트워크 오류나 권한 문제 발생 시 앱이 종료되지 않도록 방지 |
| 디버깅 | 오류 메시지를 로그로 출력하여 문제 원인 파악 |
| 사용자 경험 | UI에서 오류 시 피드백 제공 가능 (예: SnackBar 표시) |
예시:
try { await db.collection('Todos').get(); } catch (e) { print('❌ Firestore Error: $e'); }
ViewModel 설계 (Riverpod + Firestore)
class HomeViewModel extends AsyncNotifier<List<ToDoModel>> { final ToDoRepository _repository = ToDoRepository(); @override Future<List<ToDoModel>> build() async { final todos = await _repository.getToDos(); return todos; } Future<void> addTodo(ToDoModel toDo) async { state = const AsyncValue.loading(); await _repository.addToDo(toDo); state = AsyncValue.data(await _repository.getToDos()); } Future<void> toggleDone(ToDoModel toDo) async { final updated = toDo.copyWith(isDone: !toDo.isDone); await _repository.updateToDo(updated); state = AsyncValue.data(await _repository.getToDos()); } Future<void> deleteToDo(String id) async { await _repository.deleteToDo(id); state = AsyncValue.data(await _repository.getToDos()); } }
핵심 포인트
- AsyncNotifier는 비동기 상태 관리 전용
- Firestore 작업마다 state를 변경 (loading → data → error)
- UI는 ref.watch()로 실시간 반응
오늘 배운 핵심 흐름 요약
1️⃣ Firestore CRUD의 핵심 메서드는 add(), get(), update(), delete()
2️⃣ Repository는 Firestore와 직접 통신하는 계층
3️⃣ ViewModel은 Repository를 호출해 상태를 관리
4️⃣ 예외처리로 앱 안정성과 디버깅 용이성 확보
5️⃣ Riverpod의 AsyncNotifier로 비동기 상태 업데이트 자동화
핵심 요약
항목핵심 내용
| Firestore CRUD | .add(), .get(), .update(), .delete() |
| Repository 역할 | Firestore 통신 로직 담당 |
| ViewModel 역할 | 상태 관리 및 UI 데이터 연동 |
| 예외처리 이유 | 앱 안정성 + 오류 추적 |
| Riverpod 사용 이유 | 비동기 상태 관리 간결화 |
한줄 소감
오늘은 Firestore의 CRUD 흐름을 완전히 이해했고,
Riverpod과 결합해 실제 앱 구조에서 데이터 관리가 어떻게 이뤄지는지 확실히 감을 잡았다.