본문 바로가기

[플러터와 파이어베이스] 데이터 쿼리 정리(WHERE 문)

ironwhale 2023. 2. 25.

이번 포스팅에서는 1인 개발자에게 필수적인 파이어베이스 서비스 중 fireStore의 공식문서를 보고 공부한 내용을 이번 기회에 정리해보고자 작성해 보았습니다. 

 

특히 데이터를 불러오는 방법이 중요하다 느껴 관계형 DB로 치면 WHERE문(arrayContrainsAny, arrayContains, whereIn)을 파이어베이스에서 어떻게 사용하는지 정리해 보겠습니다. 

 


기본 이해

플러터로 백엔드 서버와 데이터를 주고받는 방식에 대해 일단 작성해보겠습니다. 플러터(Dart) 뿐아니라 다른 모든 언어도 다음과 같은 방식으로 서버와 데이터를 주고받고 있을 겁니다.

플러터에서 파이어베이스로 데이터 전달

  • 데이터를 하나의 객체에 담는다.
  • 데이터를 Json 형태로 변환한다.
  • 서버(firebase)에 데이터를 보낸다.
  • 서버에 저장된다.

파이어베이스에서 플러터로 데이터 전달

  • 서버에서 데이터를 Json 형태로 받는다.
  • Json 형태의 데이터를 객체에 담는다(변환한다)

앱과 백엔드 서버와 데이터를 어떤식으로 주고 받는지 이해 하셨으면 파이어베이스 사용법에 대해 알아보겠습니다. 


Cloud Firestore 초기화

우선 파이어스토어 서비스를 이용하기 위해서는 Cloud Firestore 초기화해야 합니다. 저 같은 경우에는 별도의 싱글톤 클래스를 만들어서 Provider를 통해 사용하고 있습니다.

초기화하는 코드

db = FirebaseFirestore.instance;

이제 db 인스턴스를 통해 파이어 스토어의 모든 기능이 시작됩니다.


데이터를 얻기 위해서는 DocumentSnapshot을 얻어야 한다.

파이어베이스에 저장된 데이터를 플러터로 가져오기 위해서는 DocumentSnapshot이 필요합니다. 이 다큐멘트 스냅샷에 .data() 메소드를 이용해서 Json 형태로 데이터를 받아 옵니다. 이렇게 받아온 Json 데이터를 객체로 만들어서 플러터에서 사용합니다.

 

그럼 이제부터 DocumentSnapshot을 얻기 위한 방법에 대해 알아보도록 하겠습니다. 


1. CollectionReference와 DocumentReference

Reference가 붙는건 그것의 위치를 이야기 합니다. 일종의 주소 같은 것으로 모든 파이어베이스의 데이터의 접근은Reference 부터 시작됩니다. CollectionReference는 컬렉션의 위치를 DocumentReference는 다큐먼트의 위치를 뜻하고 컬렉션 안에 모든 다큐먼트를 가지고 오려면 CollectionReference가 필요하고, 다큐먼트 안에 데이터를 가지고 오려면 DocumentReference가 필요합니다.

CollectionReference: db.collection(path)로 가져온다

CollectionReference는 db.collection(path)로 가지고 올 수 있고, 컬렉션 안에 모든 다큐멘트(데이터)를 가지고 올 때 사용합니다. 모든 다큐멘트를 가지고 오기 위해서는 여기에 .get() 메소드 사용해서 QuerySnapshot을 가지고 와야 합니다.


2. QuerySnapshot: CollectionReference.get()으로 가져온다

쿼리 스냅샷은 컬렉션레퍼런스에서 .get() 메소드를 통해 가져온 객체(?) 자료형(?)으로 공식문서에서는 쿼리의 결과로 0개 또는 여러 DocumentSnapshot이 포함되어 있다고 되어있습니다.

주로 docs 프로퍼티와 for문을 통해 원하는 데이터들은 사용합니다.

 

위의 방법은 Future<QuerySnapshot> 형태로 가지고 오지만 Stream 형태로 가지고 오려면 .snapshot()메소드를 사용하시면 됩니다. 


3. QueryDocumentSnapshot: QuerySnapshot.docs

DocumentSnapshot이 들어간 자료형까지 오셨으면 이제 우리가 원하는 데이터에 접근할 수 있다 생각하시면 됩니다. 실제 데이터를 얻기 위해서는 .data() 메소드를 사용하시면 Json형태로 파이어베이스에 저장된 데이터를 받아 볼 수 있습니다.

DocumentSnapshot에서 가장 많이 쓰는 프로퍼티와 메소드

  • .reference : DocumentReference 값으로 수정 삭제 시 필요
  • .data() : 다큐먼트 스냅샵에 있는 모든 데이터를 얻을 수 있습니다.

여기까지는 저의 포스팅이나 다른 분들의 블로그에서도 쉽게 접하실 수 있는 내용일 것입니다.  


 

파이어베이스의 WHERE문 

아래는 공식문서의 컬렉션 레퍼런스의 있는 where 메소드의 설명입니다. 첫번째 field에는 조건문을 걸 필드명을 입력합니다. 만약에 member 컬렉션에 데이터 중에 이름홍길동인 데이터를 모두 찾는 쿼리문을 사용하려면 아래와 같이 사용하면 됩니다. 

db.collection("member").where("이름", isEqualTo: "홍길동"); 


 Query<T> where(
  Object field, {
  Object? isEqualTo,
  Object? isNotEqualTo,
  Object? isLessThan,
  Object? isLessThanOrEqualTo,
  Object? isGreaterThan,
  Object? isGreaterThanOrEqualTo,
  Object? arrayContains,
  Iterable<Object?>? arrayContainsAny,
  Iterable<Object?>? whereIn,
  Iterable<Object?>? whereNotIn,
  bool? isNull,
});

대부분의 파라미터명이 직관적이라 쉽게 사용할 수 있지만 몇가지 신경써서 봐야 알수 있는 파라미터를 소개 하도록 하겠습니다. 

 

arrayContains

필드 값이 배열(리스트)인 경우 사용하는 파라미터입니다. 만약 좋아하는 과일이라는 필드가 있다고 가정해보겠습니다. 

아래는 그냥 예시로만 봐주시면 될거 같습니다. 

철수 = {좋아하는 과일 : [사과, 귤, 수박], 사는곳: 대한민국}
영희 = {좋아하는 과일 : [사과, 토마토, 배],사는곳: 미국}
db.collection("member").where("좋아하는 과일",arrayContains:사과)

위와 같이 하면 철수와 영희가 둘다 나옵니다. arrayContains는 파이어베이스에 저장된 리스트의 값 중에 내가 원하는 값이 있는 모든 다큐멘트를 가져올때 사용합니다. 좋아하는 과일 리스트에 사과가 있는 모든 사람을 가지고 옵니다.

arrayContrainsAny

db.collection("member").where("좋아하는 과일",arrayContainsAny:[귤,배])

arrayContrainsAny는 파이어베이스에 리스트(배열)로 저장된 데이터 중에 검색하고자 하는 값이 여러개 일 때 사용하는 파라미터입니다.  귤을 좋아하거나 배를 좋아하는 사람의 다큐멘트를 모두 가져올 수 있습니다. 

 

whereIn

배열이 아닌 값을 찾는데 파라미터 인데 조건을 여러개 또는(OR)로 주고 싶을때 사용합니다. 

아래 예시의 코드를 사용하면 사는곳이 대한민국 또는 미국인 사람을 모두 찾을 수 있습니다. 

db.collection("member").where("사는곳",whereIn:[대한민국, 미국])

마치며

파이어베이스는 스타트업이나 저처럼 1인 개발자 분들이 많이 사용하는 서비스라고 알고 있습니다. 다만 DB기능은 어느 정도 서비스가 확장되면 부족한 기능이 있는건 사실입니다. 대표적으로 MySQL LIKE 문을 정식으로 지원을 하고 있지 않는거 같습니다.  물론 구글에 검색해보니 이런 저런 해결책들이 나오긴 하지만 정식 지원을 하지 않다보니 번거로운 과정을 거쳐야하는 건 사실입니다. 

 

파이어 스토어 기능은 백엔드 서버를 구축할 시간에 빠르게 일단 제품을 출시해보고 시장 상황을 보는 용도로 사용하면 좋을거 같습니다.  


참고자료

https://firebase.google.com/docs/firestore/query-data/queries

 

 

Cloud Firestore에서 단순 쿼리 및 복합 쿼리 실행  |  Firebase

Firebase Summit에서 발표된 모든 내용을 살펴보고 Firebase로 앱을 빠르게 개발하고 안심하고 앱을 실행하는 방법을 알아보세요. 자세히 알아보기 의견 보내기 Cloud Firestore에서 단순 쿼리 및 복합 쿼

firebase.google.com

 

댓글