iOS/정리

[Swift] Firebase - Realtime Database & Cloud Firestore

용그무스 2022. 6. 22. 01:37
Firebase Database
- 서버리스
- 비관계형 클라우드
- 모바일, 웹앱에 적합
- 대량
- SDK, 클라이언트와 동기화 (HTTP X)
- 오프라인일 때 로컬저장 후 연결 시 동기화

Realtime Database
- json 트리 (데이터 구조가 간단)
- 정렬 || 필터링
- 하위 값까지 전체 검색
- 데이터 계층이 커질 수록 성능이 떨어짐

Cloud FireStore
- 문서, 컬렉션 구조
- 정렬 && 필터링
- 복합 고급 쿼리 제공
- 특정 계층의 값만 검색 가능

 

 

Realtime Database

var ref: DatabaseReference!
...

ref = Database.database().reference()


	//realtime 데이터베이스 읽기

//레퍼런스가 바라보는 값, 스냅샷 발생
ref.observe(.value) {[weak self] snapshot in
    //스냅샷의 타입은 딕셔너리 (실시간 데이터를 레퍼런스에서 지켜보다가 스냅샷이라는 객체로 전달. 가공-타입지정-하여 처리)
    guard let value = snapshot.value as? [String: [String: Any]] else {return}
}
 
 
	//realtime 데이터베이스 쓰기

//데이터 경로를 앎 - 데이터베이스 경로(아이디/isselected)에 값 추가
ref.child("Item\(ID)/수정할_속성").setValue(true)

//키값이 분명하지 않을 때 - 컴포넌트값(id=ex인 객체)을 검색해서 객체 스냅샷을 가져옴
ref.queryOrdered(byChild: "id").queryEqual(toValue: "검색어").observe(.value) {[weak self] snapshot in
    guard let self = self,
          let value = snapshot.value as? [String: [String: Any]],
          let key = value.keys.first else {return}

    self.ref.child("\(key)/수정할_속성").setValue(true)
}


	//realtime 데이터베이스 삭제
    
//데이터 경로를 알 때 삭제 - removeValue() 메소드
ref.child("Item\(ID)").removeValue()

//데이터 경로를 알 수 없을 때 삭제 - 수정값을 nil로 업데이트
ref.queryOrdered(byChild: "id").queryEqual(toValue: "검색어").observe(.value) {[weak self] snapshot in
    guard let self = self,
          let value = snapshot.value as? [String: [String: Any]],
          let key = value.keys.first else {return}

    self.ref.child(key)
}

 

 

Cloud Firestore

var db = Firestore.firestore()
    
    // Firestore 읽기
    
db.collection("콜렉션명").addSnapshotListener{ snapshot, error in
    //snapshot에 document가 있는지 확인
    guard let documents = snapshot?.documents else{
        print("ERROR : \(String(describing: error))")
        return
    }
    
    //객체 리스트로 가져오기
    //compactMap - documents가 nil 값 반화해도 배열에 저장하지 않음. 옵셔널처리
    self.creditCardList = documents.compactMap{
    	...
    }
}


     //Firestore 쓰기
     
//데이터 경로를 앎 - 콜렉션, 문서의 id
db.collection("콜렉션명").document("Item\(ID)").updateData(["수정할_속성": true])

//키값이 분명하지 않을 때 - 컴포넌트값(id=ex인 객체)을 검색(whereField)해서 문서 업뎃
db.collection("콜렉션명").whereField("id", isEqualTo: "검색어").getDocuments{ snapshot, _ in
    guard let document = snapshot?.documents.first else{
        print("ERROR: Firestore ..")
        return
    }
    document.reference.updateData(["수정할_속성": true])
}


	//Firestore 삭제
    
//데이터 경로를 알 때 삭제 - removeValue() 메소드
db.collection("콜렉션명").document("Item\(ID)").delete()


//데이터 경로를 알 수 없을 때 삭제 - 수정값을 nil로 업데이트
db.collection("콜렉션명").whereField("id", isEqualTo: "검색어").getDocuments{ snapshot, _ in
    guard let document = snapshot?.documents.first else{
        print("ERROR: Firestore ..")
        return
    }
    document.reference.delete()
}

 

 

 

데이터베이스 선택: Cloud Firestore 또는 실시간 데이터베이스  |  Firebase Documentation

Check out what’s new from Firebase at Google I/O 2022. Learn more 의견 보내기 데이터베이스 선택: Cloud Firestore 또는 실시간 데이터베이스 Firebase는 실시간 데이터 동기화를 지원하며 클라이언트에서 액세스할

firebase.google.com