Firebase/Cloud Firestore

Cloud Firestore 데이터 모델

4EV.ZONE 2022. 6. 6. 01:46

Cloud Firestore 데이터 모델

Cloud Firestore는 NoSQL 문서 중심의 데이터베이스다. SQL 데이터베이스와 달리 테이블이나 행이 없으며, 컬렉션으로 정리되는 문서에 데이터를 저장한다.

 

각 문서에는 키-값 쌍이 들어 있다. Cloud Firestore는 작은 문서가 많이 모인 컬렉션을 저장하는 데 최적화되어 있다.

모든 문서는 컬렉션에 저장되어야 한다. 문서는 하위 컬렉션 및 중첩 객체를 포함할 수 있으며, 둘 다 문자열 같은 기본형 필드나 목록 같은 복합 객체를 포함할 수 있다.

컬렉션과 문서는 Cloud Firestore에서 암시적으로 생성된다. 사용자는 컬렉션 내의 문서에 데이터를 할당하기만 하면 된다. 컬렉션 또는 문서가 없으면 Cloud Firestore에서 자동으로 생성한다.

문서

Cloud Firestore의 저장소 단위는 문서다. 문서는 값에 매핑되는 필드를 포함하는 간단한 레코드다. 각 문서는 이름으로 식별된다.

사용자 alovelace를 나타내는 문서는 다음과 같다.

class alovelace

first : "Ada"
last : "Lovelace"
born : 1815
더보기

참고: Cloud Firestore는 부울, 숫자, 문자열, 지리 좌표, 바이너리 BLOB, 타임스탬프 등의 다양한 데이터 유형 값을 지원한다. 배열을 사용하거나 '맵'이라고도 하는 중첩 객체를 사용하여 문서 내의 데이터를 구조화할 수도 있다.

문서의 복잡한 중첩 개체를 맵이라고 한다. 예를 들어 위의 예시에서 사용자 이름을 다음과 같이 맵으로 구조화할 수 있다.

class alovelace

name :
    first : "Ada"
    last : "Lovelace"
born : 1815

 

문서가 JSON과 매우 비슷해졌는데, 사실은 기본적으로 JSON이 사용된다. 문서가 추가적인 데이터 유형을 지원하고 크기가 1MB로 제한되는 등의 몇 가지 차이점이 있기는 하지만, 일반적으로는 문서를 간단한 JSON 레코드로 취급해도 무방하다.

컬렉션

문서는 컬렉션에 저장되며, 컬렉션은 단순히 문서의 컨테이너다. 예를 들어 users 컬렉션을 사용하여 각각 문서로 표현되는 여러 사용자를 포함할 수 있다.

사용자 collections명

class alovelace

first : "Ada"
last : "Lovelace"
born : 1815

class aturing

first : "Alan"
last : "Turing"
born : 1912

Cloud Firestore는 스키마를 사용하지 않으므로 각 문서에 어떤 필드를 넣을지와 각 필드에 어떤 유형의 데이터를 저장할지는 완전히 사용자의 재량이다. 같은 컬렉션에 포함된 여러 문서가 서로 다른 필드를 포함할 수 있고, 이러한 필드에 서로 다른 유형의 데이터를 저장할 수도 있다. 그러나 문서를 보다 쉽게 쿼리할 수 있도록 여러 문서에서 동일한 필드와 데이터 유형을 사용하는 것이 좋다.

 

컬렉션은 오로지 문서만 포함한다. 값이 있는 원시 필드를 포함하거나 다른 컬렉션을 포함할 수는 없다. Cloud Firestore에서 보다 복잡한 데이터를 구조화하는 방법은 계층적 데이터를 참조하라.

 

컬렉션 내의 문서 이름은 고유하다. 사용자 ID와 같은 고유한 키를 제공하거나 Cloud Firestore에서 임의 ID를 자동으로 만들도록 할 수 있다.

컬렉션을 직접 '생성' 또는 '삭제'할 필요는 없다. 컬렉션에 첫 번째 문서를 만들면 컬렉션이 생성된다. 컬렉션의 모든 문서를 삭제하면 컬렉션도 삭제된다.

참조

Cloud Firestore의 모든 문서는 데이터베이스 내에서 위치에 따라 고유하게 식별된다. 앞의 예시에 나왔던 alovelace 문서는 users 컬렉션에 속했다. 코드에서 이 위치를 참조하려면 위치를 가리키는 참조를 만들라.

더보기

트리 쉐이킹 작업이 가능한 웹 v9 모듈형 SDK에 대해 자세히 알아보고 버전 8에서 업그레이드하라.

[Web version 9]

import { doc } from "firebase/firestore";

const alovelaceDocumentRef = doc(db, 'users', 'alovelace');

참조는 데이터베이스의 특정 위치를 가리키는 간단한 객체이다. 해당 위치에 데이터가 있는지 여부에 관계없이 참조를 만들 수 있으며, 참조를 만들어도 네트워크 작업이 수행되지 않는다.

 

컬렉션을 가리키는 참조를 만들 수도 있다.

import { collection } from "firebase/firestore";

const usersCollectionRef = collection(db, 'users');
더보기

참고: 컬렉션 참조 및 문서 참조는 서로 구분되는 두 가지 참조 유형으로서 서로 다른 작업을 수행한다. 예를 들어 컬렉션 참조를 사용하면 컬렉션의 문서를 쿼리할 수 있고, 문서 참조를 사용하면 개별 문서를 읽거나 쓸 수 있다.

편의상 경로 구성요소를 포워드 슬래시(/)로 구분한 문자열로 문서 또는 컬렉션의 경로를 지정해 참조를 만들 수도 있다. 예를 들어 alovelace 문서에 대한 참조를 만드는 방법은 다음과 같다.

import { doc } from "firebase/firestore";

const alovelaceDocumentRef = doc(db, 'users/alovelace');

계층적 데이터

Cloud Firestore의 계층적 데이터 구조를 이해하기 위해, 메시지와 채팅방을 갖춘 채팅 앱 예시를 가정해 보자. 다음과 같이 여러 채팅방을 저장하는 rooms라는 컬렉션을 만들 수 있다.

collections_bookmark rooms

class roomA

name : "my chat room"

class roomB

...

이제 채팅방이 생겼으므로 메시지를 저장할 방법을 결정해야 한다. 채팅방 문서에는 저장하지 않는 것이 좋다. Cloud Firestore의 문서는 가벼워야 하는데, 채팅방에 매우 많은 메시지가 포함될 수 있기 때문이다. 그러나 채팅방 문서 안에 하위 컬렉션을 추가로 만들 수는 있다.

하위 컬렉션

이 시나리오에서 메시지를 저장하는 가장 좋은 방법은 하위 컬렉션을 사용하는 것이다. 하위 컬렉션은 특정 문서와 관련된 컬렉션이다.

더보기

참고: 컬렉션 그룹 쿼리를 사용하면 컬렉션 ID가 동일한 하위 컬렉션 전체를 쿼리할 수 있다.

rooms 컬렉션의 모든 채팅방 문서에 messages라는 하위 컬렉션을 만들 수 있다.

collections_bookmark rooms

class roomA

name : "my chat room"

collections_bookmark messages

class message1

from : "alex"
msg : "Hello World!"

class message2

...

class roomB

...

이 예시에서는 다음 코드를 사용하여 하위 컬렉션의 메시지에 대한 참조를 만들 수 있다.

import { doc } from "firebase/firestore";

const messageRef = doc(db, "rooms", "roomA", "messages", "message1");

컬렉션과 문서가 교대로 나타나는 패턴에 주목하자. 컬렉션과 문서는 항상 이 패턴을 따라야 한다. 컬렉션에 속한 컬렉션이나 문서에 속한 문서는 참조할 수 없다.

 

하위 컬렉션을 사용하여 데이터를 계층적으로 구조화하면 데이터에 쉽게 액세스할 수 있다. roomA의 모든 메시지를 가져오려면 하위 컬렉션 messages에 대한 컬렉션 참조를 만들고 다른 컬렉션 참조와 같은 방식으로 상호작용하면 된다.

 

하위 컬렉션의 문서도 하위 컬렉션을 포함할 수 있으므로 데이터를 더 중첩할 수 있다. 데이터를 중첩할 수 있는 최대 깊이는 100개 수준이다.

더보기

경고: 문서를 삭제해도 하위 컬렉션은 삭제되지 않는다.

하위 컬렉션이 있는 문서를 삭제해도 하위 컬렉션은 삭제되지 않는다. 예를 들어 coll/doc 문서가 더 이상 존재하지 않더라도 coll/doc/subcoll/subdoc에는 문서가 있을 수 있다. 상위 문서를 삭제할 때 하위 컬렉션의 문서도 삭제하려면 컬렉션 삭제에 설명된 대로 직접 삭제해야 한다.

 

'Firebase > Cloud Firestore' 카테고리의 다른 글

Cloud Firestore 시작하기  (0) 2022.06.05