Flutter

[Flutter] Firebase에 데이터 저장 & 조회 & 삭제 & 수정

hminor 2023. 8. 15. 18:51

FireStore에 데이터 저장 & 조회 & 삭제 & 수정

  • Firebase를 사용하면 2개의 데이터베이스가 있다
    • Realtime DataBase
    • Cloud Firestore
  • 해당 강의에서는 비교적 최근에 나온 Cloud Firestore를 사용할 예정
    • Cloud Firestore는 MongoDB 처럼 NoSQL로 비정형 데이터를 저장할 수 있다.
  • 사용하기
    • Firebase에서 만든 프로젝트 클릭
    • 빌드 → Firestore Database → 데이터베이스 만들기 → 프로덕션 모드에서 시작 → asia-northeast3 (Seoul)
    • 컬렉션 시작으로 Collection 생성
      • 여기서 잠시 Collection과 Document 에 대해 알아보자!
        • Collection 안에 document 형태로 데이터 저장
        • Collection: 폴더
        • Document: 파일, 문서
          • map 자료형으로 Object 형식으로 저장되어 있는 데이터
      • Collection ID 작성 후 → 문서 ID 자동 생성 → 필드에 key, 유형 type, 값: value를 넣기
    • 이후 데이터를 하나 더 추가 하고 싶다면
      • 문서 추가를 클릭 후 데이터 형식에 맞게 추가하면 됨
      • 데이터 형식에 맞게 저장하는 이유는 추후에 조회 시 편하게 작업하기 위함.
  • 데이터 조회하기
    • 사용하고자 하는 dart 파일에 import 와 변수에 담아주기
// firestore 사용
import 'package:cloud_firestore/cloud_firestore.dart';

// firebase의 firestore를 사용시 유용한 함수가 담겨 있음
final firestore = FirebaseFirestore.instance;
  • 이후 함수로 데이터를 조회하는 코드를 작성
    • 해당 코드는 비동기처리가 필요한 Future로 async, await 이 필요하다.
    getData() async{
        var result = await firestore.collection('컬렉션ID').doc('도큐먼트ID').get();
        print(result);
      }
    
  • 해당 코드들을 작성 후 실행을 하게 되면 아래와 같이 Permission 에러가 발생하게 된다.
    • The caller does not have permission to execute the specified operation.
    • 그래서 FireStore 페이지에서 권한을 부여해줘야 하기에 아래와 같은 과정을 처리하기
      • FireStore 페이지의 프로젝트 → 규칙
        • { allow read, write: if flase; } 를 { allow read, write: if true; } 로 변경
        • 우선은 모든 사람이 접근할 수 있도록 해주기.
    • 이후 print(result['key값']); 하게 되면 조회하고자 하는 value가 나오게 된다.
  • 만약 해당 Collection의 모든 document 데이터를 가져오려면
    • for (var x in 변수.docs) {}를 작성해 확인할 수 있다.
    getData() async{
        var result = await firestore.collection('product').get();
        for (var doc in result.docs) {
          print(doc['name']);
        }
      }
    
  • 그리고 가장 중요한 에러 처리하기!
    • 만약 가져온 result 값에 데이터가 없다면에 대한 조건을 추가한 처리
getData() async{
    var result = await firestore.collection('product').get();
    if (result.docs.isNotEmpty){
      for (var doc in result.docs) {
        print(doc['name']);
      }
    }
  }
  • try, catch 문을 사용해 실행 후 안되면 catch로 빼는 처리 방식
getData() async{
    try {
      var result = await firestore.collection('product').get();
      for (var doc in result.docs) {
        print(doc['name']);
      }
    } catch (e) {
      print('실패닷!');
    }
  }
  • 데이터베이스에 데이터 저장하기
    • 간단하게 .get() → .add( { 저장할 데이터의 map구조 } )로 변경하면 된다.
addData() async{
    await firestore.collection('product').add({'name': '상의', 'price': 3000});
  }
  • 저장도 마찬가지로 에러처리를 위해 try,catch를 사용하면 좋을 듯!
addData() async{
    try {
      await firestore.collection('product').add({'name': '상의', 'price': 3000});
    } catch (e) {
      print('저장실패!');
    }
  }
  • 데이터 조회 시 특정 조건에 맞는 데이터만 가져오기
    • .where(조건).get() 으로 조건을 작성해주면 된다.
    • 만약 가격에 3000인 데이터들을 가져오고자 한다면
    • 예전에는 where의 파라미터로 3개를 넣는 것 같은데, 지금은 좀 다른 듯하다.
getData() async{
    try {
      var result = await firestore.collection('product').where('price', isEqualTo: 3000).get();
      for (var doc in result.docs) {
        print(doc['name']);
        print(doc['price']);
      }
    } catch (e) {
      print('실패닷!');
    }
  }
  • 데이터 삭제
    • await firestore.collection('product').doc('도큐먼트ID').delete();
  • 데이터 수정
    • await firestore.collection('product').doc('도큐먼트ID').update( {수정 데이터 } );
  • 그리고 Cloud Firestore의 규칙에 다양한 권한에 대한 규칙을 작성할 수 있다.