Authentication
을 통해 사용자 인증을 구현했고, Storage
를 통해서 이미지컨텐츠를 저장하고 URL
을 얻는것 까지 구현에 성공했다. 이제 해당 정보들을 가지고 DB에 저장하는 일만 남았다.
Firebase
에는 Realtime Database
와 Firestore Database
2가지의 DB
가 존재하는데, Firestore
가 Realtime DB
를 기반으로 모바일에 최적화된 최신 DB
여서 Firesotre
를 사용했고, 그 방법을 알아보고자 한다.
모든 Firebase
기능과 같이 우선 해당 기능을 생성해준다. 기능을 생성해주면 Strorage
와 같이 위치를 지정해 주어야하며 보안규칙
을 작성해주면 된다.
Firestore
를 만들고 나면 한가지 문제가 발생하는데, 일반적으로 메뉴얼이나 검색을 통해 확인할 수 있는 Firestore
의 화면은 네이티브 모드인 반면 생성된 DB
는 아래와 같은 화면이 뜨면서 Google Cloud
콘솔로 이동해야한다고 나온다.
그렇게 Google Cloud
콘솔로 이동하게 되면 전혀 알 수 없는 화면이 나오는데, 이번 프로젝트에서는 간단한 기능만을 필요로 하기때문에 네이티브 모드로 전환이 필요했다.
클라우드 콘솔 창에서 생성한 테이터베이스를 선택한 뒤 상세화면에서 네이티브 모드로 전환
버튼을 누르면 Firestore
를 네이티브 모드로 사용할 수 있다.
Firesotre
를 생성하고 나면 이전 Firebase
기능처럼 dependency
를 추가하고 객체를 생성해서 사용해주면 된다.
하지만 Firestore
의 경우 어떤 데이터를 저장하는지 대분류를 해주는 Collection
과 각 Collection
들에 저장되는 데이터들인 Document
를 지정해서 사용해야한다.
각각의 Document
들은 key-value
로 된 데이터 들을 가지게 된다.
우선 Friestore
객체를 생성해준 뒤, 원하는 데이터를 저장할 컬렉션을 생성해준다.
private val remoteDb by lazy { FirebaseFirestore.getInstance() }
private val userCollection by lazy { remoteDb.collection("user") }
// 유저정보를 저장하는 user 컬렉션 생성
Collection
안에 사용될 각각의 데이터마다 고유한 이름을 가진 Document
를 생성해준다.
유저데이터를 저장해야할 경우에는 Firebase Auth
에서 유저의 고유한 UID
를 제공해주기 때문에 해당 값으로 Document
를 생성해준다.
val document = userCollection.document(userId)
이와같이 구성하면 user
컬렉션 안에 각 유저별로 데이터를 담을 수 있는 Document
가 생성된다.
Firestore
에는 key-value
타입의 맵형태로 데이터가 저장되지만 kotlin
을 사용할 경우, 좀 더 간편하게 data class
를 직접 저장하는게 가능하다.
별다른 과정없이 그냥 data class
타입의 객체를 .set
메서드를 사용해 저장해주면 된다.
val document = userCollection.document(userId)
val currentUser: UserEntity = currentUserInfo
document.set(currentUser)
데이터를 가져올 Document
를 지정하고 해당 도큐멘트에 .get()
메서드를 사용해가져온다.
이 경우 맵형태로 데이터를 전달받기 때문에 데이터를 사용하려면 원하는 형태로 변환을 해줘야하는데, .toObject
메서드를 사용해주면 간편하게 다시 원하는 data class
형태로 변환이 가능하다.
val document = userCollection.document(userId)
val userInfo = document.get(currentUser).toObject(UserEntity::class.java)
// UserEntity타입으로 객체를 변환해준다
하지만 sealed class
를 사용한 항목을 가지고 있는 data class
의 경우에는 toObject
를 사용하면 충돌이 발생한다. 따라서 sealed class
를 사용하는 경우에는 .toObject
가 아니라 직접 변환해주는 과정이 필요하다.
생각보다 쉽지 않음...