SQL과 달리 제한사항이 있음
Collection이라는 것을 가짐. 기본적으로 폴더와 같다고 한다.
하나의 데이터베이스는 collection들을 가지고 있고, collection은 documents를 가지고 있다.
collection은 여러개를 만들 수 있음(개인 메시지, 비디오, 댓글 등)
데이터를 집어넣는 법
가독성을 위해 타입은 기재하지 않음
// fBase.tsx
import { getFirestore } from "firebase/firestore";
export const dbService = getFirestore();
파이어베이스를 불러오는 공간에서 Firestore를 불러온다.
(dbService로 정의)
// Home.tsx
import { userObj, addDoc, serverTimestamp, }
const onSubmit = async (event) => {
event.preventDefault(); // 새로고침 방지
try{
// 콘솔에서 확인하기 위해 docRef에 저장.
// dbService에 "tweets" collection을 만들고, tweet과 타임스탬프 document를 전달한다.
const docRef = await addDoc(collection(dbService, "tweets"), {
tweet,
createdAt: serverTimestamp(),
creatorId: userObj.uid,
});
console.log("Document written with ID: ", docRef.id);
} catch (error) {
console.log("Error adding document: ", error);
}
setTweet(""); // input을 공란으로 만듬
};
타임스탬프가 현재 위치와 다르면 에러가 날 수 있으니 조심
데이터를 빼내는 법
// 비동기함수로 호출
const getTweets = async () => {
// dbService에 있는 "tweets" 콜렉션을 불러오라고 요청(query)
const q = query(collection(dbService, "tweets"));
// 데이터가 준비되면 querySnapshot에 할당(q에 들어있는 문서들을 가져옴)
const querySnapshot = await getDocs(q);
// 문서 각각에 doc의 데이터와 아이디를 obj화 해서 배열에 밀어넣음
querySnapshot.forEach((doc) => {
const tweetObj = {
...doc.data(),
id: doc.id,
};
// Tweets에 기존 항목들과 새로 추가된 데이터를 합쳐준다
setTweets((prev) => [tweetObj, ...prev]);
});
};
// 처음 앱을 실행했을 때 실행시킴
useEffect(() => {
getTweets();
}, []);