Firebase 데이터 모델링을 쉽게 배우는 가이드
Firebase Firestore에서 데이터베이스를 설계하고 모델링하는 방법을 알아볼게요. 특히 NoSQL 방식의 Firestore는 관계형 데이터베이스와 달리 테이블이 아닌 **컬렉션(collection)**과 **도큐먼트(document)**로 데이터를 관리하는 방식이에요. 이 글에서는 Firebase에서 데이터 모델링을 할 때 어떤 점들을 고려해야 하는지, 그리고 실무에 적용할 수 있는 구체적인 방법을 알려드릴게요.
1. Firebase 기본 구조 이해하기
먼저 Firebase의 기본적인 데이터 구조를 이해해야 해요. Firebase Firestore는 컬렉션과 도큐먼트로 데이터를 저장하죠. 각각의 개념을 간단히 설명드릴게요.
- 컬렉션(Collection): 여러 도큐먼트들의 모음이에요. 관계형 데이터베이스의 테이블과 비슷한 개념이지만, 더 유연하게 데이터를 저장할 수 있어요.
- 도큐먼트(Document): 하나의 레코드에 해당하며, 여러 필드(데이터)를 포함해요. 각 도큐먼트는 고유한 ID를 가지며, 필드는 다양한 데이터 타입을 가질 수 있답니다.
- 필드(Field): 도큐먼트 내에서 저장되는 데이터에요. 문자열, 숫자, 배열, 맵 등 다양한 타입을 저장할 수 있죠.
2. Firebase 데이터 모델링 기초
Firebase에서 데이터 모델링을 시작할 때는 다음을 고려하는 것이 중요해요:
- 데이터 구조화: 데이터 간의 관계를 먼저 고민해야 해요. 데이터를 어떻게 저장하고 조회할 것인지를 생각해야 하죠. 예를 들어 사용자 데이터와 책 데이터를 저장할 때는 각각의 컬렉션으로 나누고, 필요에 따라 서브컬렉션으로 연결할 수도 있어요.
- 필요한 데이터 모델링: 어떤 컬렉션을 만들고, 그 안에 어떤 도큐먼트와 필드를 넣을지 결정해야 해요. 예를 들어 책과 사용자 정보를 저장하는 서비스를 만든다면, 책 정보는 books 컬렉션에, 사용자 정보는 persons 컬렉션에 저장할 수 있죠.
- 질의 최적화: 데이터를 어떻게 쿼리할지 미리 생각해야 해요. 복잡한 조인을 지원하지 않으니 자주 참조되는 데이터를 중복 저장하는 방식으로 최적화할 필요가 있어요.
3. 예시로 배우는 Firebase 모델링
이제 예시를 통해 Firebase 모델링 방법을 구체적으로 알아볼게요. 책 추천 서비스를 만든다고 가정해볼게요. 사용자는 여러 책을 추천하고, 각 책에 대해 코멘트와 출처 링크를 남길 수 있어요.
- Books 컬렉션: 각 책에 대한 정보를 저장해요. 여기에는 책 제목, 저자, 설명, 표지 이미지와 같은 정보가 포함돼요.
{
"name": "책 제목",
"author": "저자 이름",
"description": "간단한 설명",
"image": "책 표지 이미지 URL",
"link": "책 판매 링크"
}
- Persons 컬렉션: 사용자 정보는 persons 컬렉션에 저장돼요. 여기에는 이름, 설명, 프로필 이미지 등이 포함돼요.
{
"name": "사용자 이름",
"description": "간단한 소개",
"image": "프로필 이미지 URL"
}
- Recommendations 컬렉션: 사용자가 책을 추천할 때의 정보를 저장하는 recommendations 컬렉션을 만들 수 있어요. 책과 사용자 간의 추천 관계를 관리하는 컬렉션이죠.
{
"book_id": "추천한 책의 도큐먼트 ID",
"person_id": "추천한 사람의 도큐먼트 ID",
"recommendation_message": "추천 메시지",
"source_link": "출처 링크"
}
이렇게 설계하면, 특정 사용자가 추천한 책들을 쉽게 조회할 수 있고, 책별로 받은 추천도 쉽게 관리할 수 있답니다.
4. Firebase에서 데이터 CRUD (생성, 읽기, 업데이트, 삭제)
Firebase Firestore에서는 데이터를 매우 간단하게 생성, 읽기, 업데이트, 삭제할 수 있어요. 다음은 각각의 작업에 대한 예시 코드에요.
- 데이터 생성(Create)
db.collection("books").add({
name: "예시 책",
author: "저자 이름",
description: "이 책은 ...",
image: "https://example.com/image.png",
link: "https://bookstore.com/book123"
});
- 데이터 읽기(Read)
db.collection("books").doc("도큐먼트ID").get().then((doc) => {
if (doc.exists) {
console.log("책 데이터:", doc.data());
} else {
console.log("도큐먼트가 없습니다.");
}
});
- 데이터 업데이트(Update)
db.collection("books").doc("도큐먼트ID").update({
description: "업데이트된 설명"
});
- 데이터 삭제(Delete)
db.collection("books").doc("도큐먼트ID").delete().then(() => {
console.log("도큐먼트가 삭제되었습니다.");
});
5. Firebase 모델링의 Best Practices
Firebase Firestore에서는 성능과 유지 보수성을 고려한 몇 가지 Best Practice가 있어요. 이를 잘 적용하면 프로젝트를 더 효과적으로 관리할 수 있답니다.
- 데이터 중복 허용: Firebase는 관계형 데이터베이스가 아니기 때문에 데이터를 중복해서 저장하는 것이 성능에 도움이 될 수 있어요. 예를 들어 책 정보가 자주 참조된다면 다른 컬렉션에서도 해당 정보를 중복 저장하는 것이 좋아요.
- 납작한 구조 유지: 데이터를 너무 깊게 중첩하지 말고, 납작한 구조로 유지하는 것이 좋아요. 깊은 구조는 읽기 성능을 저하시킬 수 있어요.
- 쿼리 성능 고려: Firestore는 복잡한 쿼리를 지원하지 않으니, 자주 조회되는 데이터는 한 곳에 모아서 관리하는 것이 좋아요.
6. 보안 규칙 설정
Firebase Firestore에서 보안을 유지하려면 보안 규칙을 설정하는 것이 중요해요. 예를 들어, 책 추천 서비스에서 읽기는 모두 허용하되, 쓰기는 인증된 사용자만 가능하게 할 수 있죠.
7. Firebase 관리 도구 활용
마지막으로, Firebase Console을 사용해 데이터를 관리할 수 있어요. 이를 통해 컬렉션, 도큐먼트, 필드를 쉽게 추가하고 수정할 수 있어요. 그래픽 인터페이스를 사용하면 데이터 구조를 시각적으로 파악할 수 있어서 매우 편리해요.
이상으로 Firebase 데이터 모델링에 대해 알아봤어요. Firebase는 유연하지만, 데이터를 효율적으로 설계해야 성능을 극대화할 수 있답니다. 도움이 되셨다면 다행이고, 더 궁금한 점이 있으면 언제든지 질문해주세요. 😊
{
"name": "책 제목",
"author": "저자 이름",
"description": "간단한 설명",
"image": "책 표지 이미지 URL",
"link": "책 판매 링크"
}
{
"name": "사용자 이름",
"description": "간단한 소개",
"image": "프로필 이미지 URL"
}
{
"book_id": "추천한 책의 도큐먼트 ID",
"person_id": "추천한 사람의 도큐먼트 ID",
"recommendation_message": "추천 메시지",
"source_link": "출처 링크"
}
..
db.collection("books").add({
name: "예시 책",
author: "저자 이름",
description: "이 책은 ...",
image: "https://example.com/image.png",
link: "https://bookstore.com/book123"
});
db.collection("books").doc("도큐먼트ID").get().then((doc) => {
if (doc.exists) {
console.log("책 데이터:", doc.data());
} else {
console.log("도큐먼트가 없습니다.");
}
});
db.collection("books").doc("도큐먼트ID").update({
description: "업데이트된 설명"
});
db.collection("books").doc("도큐먼트ID").delete().then(() => {
console.log("도큐먼트가 삭제되었습니다.");
});
service cloud.firestore {
match /databases/{database}/documents {
// books 컬렉션: 모두 읽기 가능, 쓰기는 인증된 사용자만 가능
match /books/{bookId} {
allow read: if true;
allow write: if request.auth != null;
}
// recommendations 컬렉션: 인증된 사용자만 읽기/쓰기 가능
match /recommendations/{recommendationId} {
allow read, write: if request.auth != null;
}
}
}