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();
}, []);