Real-Time Database
- 강점
1. 사용자가 온라인 또는 오프라인 상태일 때 모니터링하기 위해 사용자 존재를 지원합니다.
2. 대기 시간이 매우 짧습니다.
3. 대역폭 및 스토리지에 대한 요금은 부과되지만 데이터베이스에서 수행되는 작업에 대해서는 요금이 부과되지 않습니다.
4. 200k 동시 연결로 확장됩니다.
- 약점
1. 다중 지역 지원이 없습니다. 데이터는 지역 구성에서만 사용할 수 있습니다.
2. 제한된 정렬 및 필터링 기능이 있습니다.
Firestore
강점
약점
import Firebase
import FirebaseDatabase
enum RepositoryError: Error {
case encoding
case decoding
case JSONSerialization
case network
case dataSnapshot
}
class FirebaseRepository<T: Codable> {
typealias Entity = T
private let reference: DatabaseReference
private let rootChildID: String
init(rootChildID: String) {
self.rootChildID = rootChildID
reference = Database.database().reference()
}
func setValue(childId: String, model: Entity) throws {
guard let encodedData = try? JSONEncoder().encode(model)
else { throw RepositoryError.encoding }
guard let jsonData = try? JSONSerialization.jsonObject(with: encodedData)
else { throw RepositoryError.JSONSerialization}
reference.child(rootChildID).child(childId).setValue(jsonData)
}
func readAllValue(completionHandler: @escaping((Result<[Entity], RepositoryError>) -> Void)) {
reference.child(rootChildID).observeSingleEvent(of: .value, with: { [weak self] snapshot in
guard let self = self
else { return }
let dictionary = self.convertDataSnapshot(snapshot)
let jsondata = self.convertJSONSerialization(with: dictionary)
let model = self.decode(with: jsondata)
completionHandler(model)
})
}
func deleteValue(childId: String) {
reference.child(rootChildID).child(childId).removeValue()
}
private func decode(with data:
Result<Data, RepositoryError>) -> Result<[Entity], RepositoryError> {
switch data {
case .success(let jsonData):
guard let decodedData = try? JSONDecoder().decode([Entity].self, from: jsonData)
else { return .failure(.decoding)}
return .success(decodedData)
case.failure(let error):
return .failure(error)
}
}
private func convertDataSnapshot(_ snapshot:
DataSnapshot) -> Result<[String : Any], RepositoryError> {
guard let dictionary = snapshot.value as? [String: Any]
else { return .failure(.dataSnapshot) }
return .success(dictionary)
}
private func convertJSONSerialization(with dictionary:
Result<[String : Any], RepositoryError>)
-> Result<Data, RepositoryError>
{
switch dictionary {
case .success(let data):
guard let jsonData = try? JSONSerialization.data(withJSONObject: data)
else { return .failure(.JSONSerialization)}
return .success(jsonData)
case .failure(let error):
return .failure(error)
}
}
}