카테고리 없음

Cloud Firestore CRUD & Riverpod 상태관리 연동

kwontete 2025. 11. 10. 21:18

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과 결합해 실제 앱 구조에서 데이터 관리가 어떻게 이뤄지는지 확실히 감을 잡았다.