
파이어스토어(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 메서드를 써서 해당 필드를 삭제할 수 있습니다.
.
.
.
마치며
올해 개발 공부를 시작하면서 많은 현직 개발자와 취준 개발자의 기술 블로그를 읽어봤습니다. 개발자분들의 정성이 담긴 개발 글 덕분에 프로젝트를 진행하거나 공부할 때 막혔던 부분들이 시원하게 해결됐습니다. 프로젝트를 진행하면서 새로 배운 기술 스택에 대해 저도 다시 한 번 정리해보고 제 블로그에 찾아오신 분들에게 많은 도움이 되었으면 좋겠습니다.
첫번째 글로 파이어베이스의 파이어스토어 메서드에 대해 가볍게 정리해봤습니다. 파이어베이스만의 문법이 익숙치 않아서 적응하는데 시간이 꽤 걸렸지만 한 번 적응하고나니 정말 편했습니다. 특히, 프론트엔드 개발자라면 파이어베이스가 백엔드 대부분의 기능을 지원해주기 때문에 알아두는 것을 적극 추천합니다.
제 포스팅에 대한 질문과 피드백은 언제나 환영합니다.
'Firebase' 카테고리의 다른 글
| [Firebase] Authentication으로 Email 로그인 구현하기 (3) - 로그아웃/회원탈퇴 (1) | 2024.10.07 |
|---|---|
| [Firebase] Authentication으로 Email 로그인 구현하기 (2) - 로그인/회원가입 (2) | 2024.10.06 |
| [Firebase] Authentication으로 Email 로그인 구현하기 (1) - 기초 (0) | 2024.10.06 |
| [Firebase] 파이어베이스란 무엇일까? (3) | 2024.10.06 |