Cloud Firestore vs Realtime Database
아래 표를 보면 자세하게 Cloud Firestore와 Realtime Database의 차이를 알 수 있습니다.
정리하자면, 큰 단위의 데이터 요청이 자주 발생한다면 Cloud Firestore가 유리할 것이고, 가벼운 데이터이지만 문서에 대한 CRUD작업이 자주 발생한다면 Realtime Database가 더 유리할 것입니다.
차이점 | Cloud Firestore | Realtime Database |
데이터 모델 | - 키-값 쌍이 들어 있고, 작은 문서가 많이 모인 컬렉션을 저장 - NOSQL이지만 SQL처럼 테이블처럼 관리하기에 용이 |
- 데이터를 하나의 큰 JSON 트리로 저장 - 복잡한 계층적 데이터를 정규화 |
쿼리 | - 정렬 및 필터링과 조건문을 동시에 사용 가능 - 컬렉션이 가지고 있는 문서만 반환 - 불필요한 하위 데이터까지 반환하는 성능 문제 발생 X |
- 정렬 및 필터링 가능 - 동시에 조건문 수행 불가능 - 해당 depth의 데이터를 반환할 때 그 이하의 모든 depth의 데이터도 함께 반환 - 정규화가 제대로 이루어지지 않은 데이터베이스라면 불필요한 데이터까지 매번 가져와야 하기 때문에 심각한 성능 저하 발생 |
확장성 | - 샤딩을 이용하지 않고 자동으로 수행 - 현재 확장 한도는 동시 연결 수 약 1,000,000개, 초당 쓰기 10,000회 |
- 단일 데이터베이스는 동시 연결이 약 100,000개, 초당 쓰기 약 1,000회까지 확장 가능 - 추가로 확장하려면 데이터를 여러 데이터베이스로 샤딩 |
가격 정책 | - 용량, document CRUD 연산 횟수에 따라 주로 과금 | - 용량, 대역폭(다운로드 크기)에 대해 주로 과금 |
Cloud Firestore 사용하기
Cloud Firestore는 Realtime Database와 같이 유연하고 확장 가능한 NoSQL 클라우드 데이터베이스이기 때문에 실시간으로 모든 클라이언트에서 데이터가 동기화되어 사용할 수 있습니다.
1) Firebase - Firestore Database에서 [데이터베이스 만들기] 버튼을 클릭합니다.
2) 먼저 Cloud Firestore의 보안 규칙을 설정해야 하는데 프로덕션 모드에서 시작을 선택합니다.
- 프로덕션 모드 : 데이터는 기본적으로 비공개되며, 인증된 사용자만 읽기/쓰기가 가능
- 테스트 모드 : 데이터가 기본적으로 공개되며, 참조 사용자는 누구나 읽기/쓰기가 가능
3) 그 다음 Cloud Firestore 위치를 설정해야 하는데 default인 미국을 선택합니다.
4) 모든 설정이 끝났다면 Firestore가 생성되고 원하는 DB 구조에 맞게 컬렉션과 문서를 추가합니다.
5) 추가적으로 다음과 같이 인증된 사용자만 Firestore에 접근 가능하도록 규칙을 설정할 수 있습니다.
6) Firestore를 사용하기 위해서 build.gradle에 해당 라이브러리를 추가합니다.
implementation 'com.google.firebase:firebase-firestore-ktx'
7) 안드로이드 코드에서 FirebaseFirestore 객체를 선언 및 초기화 합니다.
// FirebaseFirestore 객체 선언
private lateinit var firestore: FirebaseFirestore
// firestore 객체 초기화
firestore = Firebase.firestore
8) Firestore에서의 데이터 쓰기/읽기 기능을 구현합니다.
- 데이터 쓰기 : set()을 통해 문서를 만들거나 덮어씀
- 데이터 읽기 : get()을 통해 문서의 내용을 검색함
// 데이터 쓰기
firestore.collection("articles").document(articleId)
.set(articleModel)
.addOnSuccessListener { Log.d(TAG, "Successfully Written!") }
.addOnFailureListener { it.printStackTrace() }
// 데이터 읽기
firestore.collection("articles").document(articleId)
.get()
.addOnSuccessListener {
val model = it.toObject<ArticleModel>()
binding.tvDescription.text = model?.description
}
.addOnFailureListener { it.printStackTrace() }
9) Firestore에서의 데이터 업데이트/삭제 기능을 구현합니다.
- 데이터 업데이트 : update()를 통해 전체 문서를 덮어쓰지 않고 문서의 일부 필드를 업데이트함
- 데이터 삭제 : delete()를 통해 문서를 삭제하거나 FieldValue.delete()를 통해 필드를 삭제함
// 데이터 업데이트
firestore.collection("bookmark").document(uid)
.update("articleIds", true)
.addOnSuccessListener { Log.d(TAG, "Successfully written!") }
.addOnFailureListener { it.printStackTrace() }
// 문서 삭제
firestore.collection("bookmark").document(uid)
.delete()
.addOnSuccessListener { Log.d(TAG, "Successfully deleted!") }
.addOnFailureListener { it.printStackTrace() }
// 필드 삭제
firestore.collection("bookmark").document(uid)
.update(
hashMapOf<String, Any>(
"articleIds" to FieldValue.delete()
)
)
.addOnSuccessListener { Log.d(TAG, "Successfully deleted!") }
.addOnFailureListener { it.printStackTrace() }
Cloud Storage 사용하기
구글 Firebase SDK 자체에서 앱의 파일 업로드 및 다운로드에 보안이 적용되어 있기 때문에 Cloud Storage를 사용하면 안전하게 이미지, 오디오, 동영상 등의 사용자 제작 콘텐츠를 저장할 수 있습니다.
1) Firebase - Storage에서 [시작하기] 버튼을 클릭합니다.
2) 먼저 Cloud Storage의 보안 규칙을 설정해야 하는데 프로덕션 모드에서 시작을 선택합니다.
- 프로덕션 모드 : 데이터는 기본적으로 비공개되며, 인증된 사용자만 읽기/쓰기가 가능
- 테스트 모드 : 데이터가 기본적으로 공개되며, 참조 사용자는 누구나 읽기/쓰기가 가능
3) 그 다음 Cloud Storage 위치를 설정해야 하는데 이전에 Cloud Firestore에서 미국을 선택했기 때문에 자동으로 미국이 선택되는 것을 알 수 있습니다.
4) 모든 설정이 끝났다면 Storage가 생성되고 원하는 폴더 구조에 맞게 폴더를 추가합니다.
또한, 다음과 같이 인증된 사용자만 Storage에 접근 가능하도록 규칙을 설정할 수 있습니다.
5) Storage를 사용하기 위해서 build.gradle에 해당 라이브러리를 추가합니다.
implementation 'com.google.firebase:firebase-storage-ktx'
6) 안드로이드 코드에서 FirebaseStorage 객체를 선언 및 초기화 합니다.
// FirebaseStorage 객체 선언
private lateinit var storage: FirebaseStorage
// storage 객체 초기화
storage = Firebase.storage.reference
7) Storage에서의 파일 업로드/다운로드 기능을 구현합니다.
- 파일 업로드 : putBytes(), putStream(), putFile()
- 파일 다운로드 : getBytes(), getStream(), getFile(), getDownloadUrl()
// 파일 업로드/다운로드
storage.child("articles/photo").child(fileName)
.putFile(uri)
.addOnCompleteListener { task ->
if (task.isSuccessful) {
storage.child("articles/photo/$fileName")
.downloadUrl
.addOnSuccessListener {
successHandler(it.toString())
}.addOnFailureListener {
errorHandler(it)
}
} else {
errorHandler(task.exception)
}
}
'안드로이드 > 활용' 카테고리의 다른 글
[Android] CameraX 사용하기 (0) | 2023.10.06 |
---|---|
[Android] ExoPlayer 사용하기 (0) | 2023.10.05 |
[Android] 카카오 로그인 구현하기 (0) | 2023.09.22 |
[Android] Moshi로 JSON 파싱하기 (0) | 2023.09.14 |
[Android] 구글 지도 사용하기 (0) | 2023.09.14 |