Firebase

[Firebase] Firestore의 메서드 정리

jundyu 2024. 10. 4. 21:53


파이어스토어(Firestore)는 구글이 제공하는 NoSQL 클라우드 데이터베이스로, 실시간 데이터 동기화 및 대규모 데이터 처리에 적합합니다. 문서 기반 구조로 데이터를 컬렉션의 문서에 저장하며, 서버리스 환경에서 확장성과 성능이 뛰어납니다. Storage에 비해 확장성과 복잡한 쿼리에 강점이 있습니다.
파이어스토어의 데이터베이스를 다룰 땐 컬렉션, 문서, 필드라는 용어를 사용하는데 이 용어들을 RDBMS와 비교하자면 각각 테이블, 레코드, 컬럼에 해당합니다. 예를 들어, 컬렉션은 users, posts 같은 테이블이 될 수 있고 문서는 각각의 사용자, 게시글 같은 행이 될 수 있습니다. 마지막으로 필드는 user_id, post_title 같은 컬럼에 해당합니다.
 
아래는 Firestore의 메서드를 정리한 내용입니다.

 

0. 인스턴스 생성

const db = getFirestore(app);

우선 firebase.js라는 파이어베이스 설정 파일에서 파이어스토어의 인스턴스 이름은 db로 지정했습니다.
 

1. 데이터 참조

1-1. db에서 문서 참조하기

const userDocRef = doc(db, '컬렉션이름', '문서 아이디');

doc 메서드는 db에서 특정 컬렉션과 고유한 문서 아이디를 지정해 해당 문서에 대한 참조를 만들 수 있습니다. 이렇게 참조를 만들어두고 나중에 추가, 조회, 수정, 삭제의 작업에 계속 호출해서 사용하면 됩니다.

1-2. db에서 컬렉션 참조하기

const usersCollectionRef = collection(db, '컬렉션 이름');

collection을 사용해서 특정 컬렉션의 전체 문서를 참조할 수 있습니다.
 

2. 데이터 조회

2-1. db에서 참조한 특정 문서를 가져오기

const fetchUser = async () => {
	const userSnapshot = await getDoc(userDocRef);
	if(userSnapshot.exists()){ // .. // }
};

getDoc는 참조한 문서에 대해 실제로 필드의 값들을 가져오는 메서드입니다. 

2-2. db에서 참조한 특정 컬렉션을 가져오기

const fetchCollectionUser = async () => {
	const usersSnapshot = await getDocs(usersCollectionRef);
	usersSnapshot.forEach((doc) => { // .. // });
};

getDocs  메서드로 가져온 경우 컬렉션 내의 문서가 하나일지라도 배열 형태로 반환됩니다.

2-3. 문서 및 필드값 접근

const user = userSnapshot.data();
 
const user = usersSnapshot.docs[0].data();

getDoc 메서드로 가져온 경우 data() 메서드를 통해 문서의 필드와 값을 객체로 변환해줍니다.
getDocs 메서드로 데이터를 가져온 경우 docs[0]를 사용하면 첫번째 문서의 snapshot을 반환합니다.
 

3. 데이터 조회

흔히 아는 SQL문과 비슷하지만 제공하는 문법은 적습니다. query메서드는 쉽게 생각해서 collection 메서드처럼 query가 적용된 컬렉션 배열이 반환됩니다.

3-1. 단순 조건 쿼리

const queryCollection = query(collection(db, '컬렉션 이름'), where('필드 이름', '조건 연산자', 비교값));

첫번째 인자로 컬렉션에 대한 참조가 전달되고, 두번째 인자 이후부터는 조건문인 where 메서드가 전달됩니다. (collection에 대한 설명은 위를 참고해주세요.) where 메서드 및 나중에 소개할 limit, orderBy 메서드는 여러번 체이닝해서 사용 가능합니다.
필드 이름은 문서 내에 저장된 필드 이름 중 비교될 값의 필드명을 사용하면 됩니다.
조건 연산자는 다음과 같습니다.

  • !=, ==, <, <=, >, >=
  • array-contains

마지막으로 비교값은 지정한 필드 이름의 값과 비교될 값입니다.

3-2. 정렬

const queryCollection = query(collection(db, '컬렉션 이름'), orderBy('필드 이름', '정렬 기준'));

orderBy 메서드의 첫번째 인자를 기준으로 문서를 정렬합니다. 이때 정렬 기준에는 asc, desc가 들어갈 수 있습니다.

3-3. 제한

const queryCollection = query(collection(db, '컬렉션 이름'), limit(n));

limit 메서드를 사용하면 query로 반환되는 문서들 중 상위 n개만 반환되고 나머지는 버려집니다.

Ex.

const q = query(
  collection(db, "users"),
  where("age", ">", 18),
  orderBy("age", "desc"),
  limit(10)
);

 

4. 데이터 생성

4-1. db에 문서 추가 (1)

const addUser = async () => {
	await addDoc(collection(db, '컬렉션 이름'), {
		user_name : 이름,
		user_age : 나이,
		...});
};

addDoc 메서드는 문서의 ID를 자동으로 고유값으로 생성해줍니다. 이전의 참조하는 메서드에서 세번째 인자로 문서 아이디를 전달했는데 이때의 문서 아이디를 자동으로 설정해주는 메서드입니다.

4-2. db에 문서 추가 (2)

const saveUserData = async () => {	
	await setDoc(doc(db, "users", "문서 아이디"), { name: 이름, age: 나이, ...});
};

setDoc 메서드는 문서의 아이디를 사용자가 직접 설정 가능합니다. 이때 addDoc와는 다르게 만약 해당 문서 아이디가 존재하지 않는다면 추가하고, 존재한다면 덮어쓰는 수정의 역할을 합니다.
 

5. 데이터 수정

5-1. 필드 값 수정

await updateDoc(userDocRef, {
	age: increment(n),
	...
});

updateDoc 메서드는 기존에 존재하는 특정 문서를 참조해서 필드의 값을 수정합니다. 이때 increment(1)은 int값을 1 증가시켜주고, increment(-1)은 1 감소해주는 메서드입니다.
 

6. 데이터 삭제

6-1. 특정 문서 삭제

await deleteDoc(userDocRef);

deleteDoc 메서드는 참조한 특정 문서 자체를 삭제할 수 있습니다. 인자로 문서 참조를 전달합니다.

6-2. 특정 필드 삭제

await updateDoc(userDocRef, {age : deleteField() });

만약 특정 필드만 삭제하고 싶다면 deleteDoc를 사용하지 않습니다. 대신 updateDoc에서 필드값으로 deleteField 메서드를 써서 해당 필드를 삭제할 수 있습니다.

 

.

.

.

 

마치며

올해 개발 공부를 시작하면서 많은 현직 개발자와 취준 개발자의 기술 블로그를 읽어봤습니다. 개발자분들의 정성이 담긴 개발 글 덕분에 프로젝트를 진행하거나 공부할 때 막혔던 부분들이 시원하게 해결됐습니다. 프로젝트를 진행하면서 새로 배운 기술 스택에 대해 저도 다시 한 번 정리해보고 제 블로그에 찾아오신 분들에게 많은 도움이 되었으면 좋겠습니다.
첫번째 글로 파이어베이스의 파이어스토어 메서드에 대해 가볍게 정리해봤습니다. 파이어베이스만의 문법이 익숙치 않아서 적응하는데 시간이 꽤 걸렸지만 한 번 적응하고나니 정말 편했습니다. 특히, 프론트엔드 개발자라면 파이어베이스가 백엔드 대부분의 기능을 지원해주기 때문에 알아두는 것을 적극 추천합니다.
제 포스팅에 대한 질문과 피드백은 언제나 환영합니다.