[TIL] Firebase시리즈 - 3. Firestore

박봉팔·2024년 2월 29일
0

Firebase Data Base

Authentication을 통해 사용자 인증을 구현했고, Storage를 통해서 이미지컨텐츠를 저장하고 URL을 얻는것 까지 구현에 성공했다. 이제 해당 정보들을 가지고 DB에 저장하는 일만 남았다.

Firebase에는 Realtime DatabaseFirestore Database 2가지의 DB가 존재하는데, FirestoreRealtime DB를 기반으로 모바일에 최적화된 최신 DB여서 Firesotre를 사용했고, 그 방법을 알아보고자 한다.


Firestore

모든 Firebase기능과 같이 우선 해당 기능을 생성해준다. 기능을 생성해주면 Strorage와 같이 위치를 지정해 주어야하며 보안규칙을 작성해주면 된다.



Firestore를 만들고 나면 한가지 문제가 발생하는데, 일반적으로 메뉴얼이나 검색을 통해 확인할 수 있는 Firestore의 화면은 네이티브 모드인 반면 생성된 DB는 아래와 같은 화면이 뜨면서 Google Cloud콘솔로 이동해야한다고 나온다.

그렇게 Google Cloud콘솔로 이동하게 되면 전혀 알 수 없는 화면이 나오는데, 이번 프로젝트에서는 간단한 기능만을 필요로 하기때문에 네이티브 모드로 전환이 필요했다.


클라우드 콘솔 창에서 생성한 테이터베이스를 선택한 뒤 상세화면에서 네이티브 모드로 전환 버튼을 누르면 Firestore를 네이티브 모드로 사용할 수 있다.


Firestore 사용하기

Firesotre를 생성하고 나면 이전 Firebase기능처럼 dependency를 추가하고 객체를 생성해서 사용해주면 된다.

하지만 Firestore의 경우 어떤 데이터를 저장하는지 대분류를 해주는 Collection과 각 Collection들에 저장되는 데이터들인 Document를 지정해서 사용해야한다.

각각의 Document들은 key-value로 된 데이터 들을 가지게 된다.

1. Collection 지정

우선 Friestore객체를 생성해준 뒤, 원하는 데이터를 저장할 컬렉션을 생성해준다.

private val remoteDb by lazy { FirebaseFirestore.getInstance() }
private val userCollection by lazy { remoteDb.collection("user") }
// 유저정보를 저장하는 user 컬렉션 생성

2. Document 지정

Collection안에 사용될 각각의 데이터마다 고유한 이름을 가진 Document를 생성해준다.

유저데이터를 저장해야할 경우에는 Firebase Auth에서 유저의 고유한 UID를 제공해주기 때문에 해당 값으로 Document를 생성해준다.

val document = userCollection.document(userId)

이와같이 구성하면 user컬렉션 안에 각 유저별로 데이터를 담을 수 있는 Document가 생성된다.


3. Data 담기

Firestore에는 key-value타입의 맵형태로 데이터가 저장되지만 kotlin을 사용할 경우, 좀 더 간편하게 data class를 직접 저장하는게 가능하다.

별다른 과정없이 그냥 data class타입의 객체를 .set메서드를 사용해 저장해주면 된다.

val document = userCollection.document(userId)
val currentUser: UserEntity = currentUserInfo

document.set(currentUser)

4. 데이터 가져오기

데이터를 가져올 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가 아니라 직접 변환해주는 과정이 필요하다.


오늘은 어땠나요?

생각보다 쉽지 않음...

profile
개발 첫걸음! 가보자구!

0개의 댓글