Firestore 에 저장한 데이터 가져와서 띄우기

순순·2024년 5월 31일

Android

목록 보기
9/12

Firestore의 기본 용어


  • Collection
    • 테이블
    • 데이터를 모아 놓은 상위 집합
  • Document
    • 컬렉션 내의 개별 데이터
  • Field:
    • 컬럼
    • 각 문서의 개별 데이터를 저장하는 항목
  • Document ID
    • Firestore에서 각 문서를 식별하기 위한 고유한 ID
    • 문서 ID는 자동생성 해주는데, 보통 시간에 관한 정보로 자동생성하기 때문에 나중에 만든 문서의 시간값이 더 크다.
  • Sequence
    • index 역할

데이터 가져오기


일반적으로 Firestore에서 데이터를 가져오려면 다음과 같은 단계가 필요하다.

  1. Firebase에 접근할 Firebase 인스턴스 초기화
  2. 컬렉션(=테이블)에 접근할 수 있는 Firesotre 컬렉션 참조를 가져온다.
  3. 필요한 쿼리를 만든다.
  4. 쿼리 실행 및 결과 처리

예제 코드

아래 코드에서는 특정 게시글 목록을 가져오는 과정을 보여준다.

    class CommunityDao {
        // 게시글 목록을 가져온다.
        suspend fun getContentList(contentType: Int): MutableLiveData<List<CommunityViewModel>> {
            // 게시글 정보를 담을 MutableLiveData
            val resultLiveData = MutableLiveData<List<CommunityViewModel>>()
    
            val job1 = CoroutineScope(Dispatchers.IO).launch {
                // Firebase 초기화
                Firebase.initializeApp(context)
    
                // Firestore에 접근할 수 있는 Firestore 인스턴스 가져오기
                val firestore = Firebase.firestore
    
                // 컬렉션에 접근할 수 있는 Firestore 컬렉션 참조 가져오기
                val collectionReference = firestore.collection("posts")
    
                // Query 생성
                val query = collectionReference.whereEqualTo("contentType", contentType)
    
                // 쿼리 실행
                query.get().addOnSuccessListener { documents ->
                    val postList = mutableListOf<CommunityViewModel>()
                    for (document in documents) {
                        // Firestore 문서에서 데이터를 가져와서 CommunityViewModel에 매핑하고 postList에 추가합니다.
                        val communityViewModel = document.toObject(CommunityViewModel::class.java)
                        postList.add(communityViewModel)
                    }
                    // MutableLiveData에 게시글 목록 설정
                    resultLiveData.postValue(postList)
                }.addOnFailureListener { exception ->
                    // 쿼리 실패 처리
                }
            }
            // 결과 MutableLiveData 반환
            return resultLiveData
        }
    }

Firestore의 쿼리 메서드


whereEqualTo

whereEqualTo 메서드는 특정 필드의 값이 지정된 값과 동일한 문서만 가져오는 쿼리를 만든다. whereEqualTo(”필드명”, 변수명) 형태이다.

ex) whereEqualTo(”contentType”, contentType) 일 경우, "contentType" 필드가 주어진 변수 값과 같은 문서만을 가져온다.


QuerySnapShot 으로 쿼리 결과 처리

query.get() 메서드를 실행하면 QuerySnapshot 객체가 반환된다. QuerySnapshot은 Firestore 쿼리의 결과를 담고 있는 컨테이너로, 쿼리의 결과로 선택된 모든 문서를 포함한다.

forEach를 통해 문서를 순회하면서 각 문서를 처리할 수 있다. QuerySnapshot은 아래 예시와 같이 forEach 메서드를 제공한다

// 각 문서를 CommunityViewModel 객체로 변환 후 리스트에 추가
querySnapshot.forEach { document ->
    val communityViewModel = document.toObject(CommunityViewModel::class.java)
    postList.add(communityViewModel)
}

querySnapShot ?

  • 쿼리 결과물을 담는 일종의 컨테이너 역할.
  • 쿼리 결과에 따라 문서를 추가하거나 제거하는 작업 가능. (문서 = documents 속성)
  • 쿼리 결과로 선택된 모든 문서를 포함하는 컬렉션.
  • 이 객체를 사용하여 문서의 필드값이나 문서의 ID 확인 가능.
  • 지정된 필드의 값이 주어진 값과 동일한 문서를 반환하는 쿼리 생성

QuerySnapShot은 클래스인데, 직접적으로 객체를 생성할 수는 없다. Firestore 에서 쿼리를 실행하여 반환되는 결과를 담는 클래스이기 때문이다.

따라서 var querySnapshow = QuerySnapshot()과 같이 직접 생성하는 것은 불가능하다. 대신, 쿼리를 생성하고 나면 그 결과로 생성된다.

여기서 posts는 실제 firebase에 정의한 컬렉션 이름이다.

val collectionReference = Firebase.firestore.collection("posts")
val query = collectionReference.whereEqualTo("contentType", contentType)
	

쿼리를 forEach로 처리하는 이유

Firestore 쿼리 결과가 QuerySnapshot 객체에 저장되기 때문에, 개별 문서에 접근하기 위해 forEach를 사용하여 반복 처리한다.

forEach를 통해 각 문서를 순회하면서 원하는 처리를 할 수 있으며, 이 과정에서 문서 데이터를 변환해 리스트에 추가하는 등의 작업이 가능하다. 또한, 쿼리 결과의 문서를 효율적으로 처리하고, 필요한 데이터만을 선별하여 이용할 수 있게 해준다.

그 외 쿼리 메서드

    whereGreaterThan(): 지정된 필드의 값이 주어진 값보다 큰 문서를 반환합니다.
    
    whereLessThan(): 지정된 필드의 값이 주어진 값보다 작은 문서를 반환합니다.
    
    whereGreaterThanOrEqualTo(): 지정된 필드의 값이 주어진 값보다 크거나 같은 문서를 반환합니다.
    
    whereLessThanOrEqualTo(): 지정된 필드의 값이 주어진 값보다 작거나 같은 문서를 반환합니다.
    
    orderBy(): 결과를 지정된 필드의 값에 따라 정렬합니다.
    
    limit(): 반환되는 결과 수를 제한합니다.
    
    startAt(): 결과를 지정된 값 이후의 값으로 시작합니다.
    
    startAfter(): 결과를 지정된 값 이후의 값 다음으로 시작합니다.
    
    endAt(): 결과를 지정된 값 이전의 값으로 끝냅니다.
    
    endBefore(): 결과를 지정된 값 이전의 값 전에 끝냅니다.
    
    whereArrayContains(): 지정된 필드가 제공된 값과 동일한 배열을 포함하는 문서를 반환합니다. 이 메서드는 배열 필드에서 사용됩니다.

결론


fireStore에 접근해서 데이터를 가져오는 흐름은 다음과 같다.

  1. query.get으로 쿼리 실행
  2. 성공적으로 실행되면 querySnapShot에 쿼리 결과가 담겨짐
  3. querySnapShot 객체를 이용하여 쿼리 결과 처리
profile
플러터와 안드로이드를 공부합니다

0개의 댓글