Firebase - query(), getDocs(), onSnapshot()์„ ์‚ฌ์šฉํ•ด Firestore DB์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ

2025. 6. 16. 20:02ยท๐Ÿ”ฅ Firebase

Firebase

 

โœ… query()


getDocs()์— ๋„ฃ์–ด์ค„ query๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

const tweetsQuery = query(
      collection(db, "tweets"),
      orderBy("createdAt", "desc")
    );

 

โœ… getDocs()


getDocs()๋กœ query์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ๋“ค์„ ๊ฐ€์ ธ์˜จ๋‹ค.

getDocs()๋Š” QuerySnapshot์„ returnํ•œ๋‹ค.

const snapshot = await getDocs(tweetsQuery);

 

โœ… Fetching ํ•ด์˜จ ๋ฐ์ดํ„ฐ๋“ค์„ state์— ์ €์žฅํ•˜๋Š” ๋™์ž‘์„ fetchTweets ํ•จ์ˆ˜์— ๋‹ด๋Š”๋‹ค.


fetchTweets ํ•จ์ˆ˜๋Š” useEffect๋กœ ์‹คํ–‰

 const [tweets, setTweets] = useState<ITweet[]>([]);
  const fetchTweets = async () => {
    const tweetsQuery = query(
      collection(db, "tweets"),
      orderBy("createdAt", "desc")
    );
    const snapshot = await getDocs(tweetsQuery);
    const tweets = snapshot.docs.map((doc) => {
      const { tweet, createdAt, userId, username, photo } = doc.data();
      return {
        tweet,
        createdAt,
        userId,
        username,
        photo,
        id: doc.id,
      };
    });
    setTweets(tweets);
  };
  useEffect(() => {
    fetchTweets();
  }, []);

 

ํ•˜์ง€๋งŒ ์ด ๋ฐฉ์‹์€ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์„ ๋ฐ˜์˜ํ•˜์ง€ ๋ชป ํ•œ๋‹ค.

 

โœ… onSnapshot()


์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜

 

์ธ์ž๋กœ reference์™€ observer๋ฅผ ๋ฐ›๋Š”๋‹ค.

(reference๋กœ๋Š” query๋ฅผ ์ฃผ๊ณ  observer์—๋Š” ํ•จ์ˆ˜๋ฅผ ๋„˜๊ฒจ์ฃผ๋ฉด ๋œ๋‹ค. ํ•ด๋‹น ํ•จ์ˆ˜๋Š” ์ธ์ž๋กœ snapshot์„ ๋ฐ›๋Š”๋‹ค.)

 

onSnapshot()์€ unsubscribe(๊ตฌ๋… ์ทจ์†Œ) ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

useEffect(() => {
    let unsubscribe: Unsubscribe | null = null;
    const fetchTweets = async () => {
      const tweetsQuery = query(
        collection(db, "tweets"),
        orderBy("createdAt", "desc"),
        limit(25)
      );
      unsubscribe = await onSnapshot(tweetsQuery, (snapshot) => {
        const tweets = snapshot.docs.map((doc) => {
          const { tweet, createdAt, userId, username, photo } = doc.data();
          return {
            tweet,
            createdAt,
            userId,
            username,
            photo,
            id: doc.id,
          };
        });
        setTweets(tweets);
      });
    };
    fetchTweets();
    return () => {
      //   unsubscribe && unsubscribe();
      unsubscribe?.();
    };
  }, []);

 

โœ… deleteDoc(), deleteObject()


์ธ์ž๋กœ ์‚ญ์ œํ•  document์— ๋Œ€ํ•œ ref๋ฅผ ์ฃผ๋ฉด ๋œ๋‹ค.

await deleteDoc(doc(db, "tweets", id));

 

์‚ฌ์ง„์ด ์ฒจ๋ถ€๊ฐ€ ๋˜์–ด ์žˆ๋‹ค๋ฉด ์‚ฌ์ง„๋„ ์‚ญ์ œํ•ด์•ผ ํ•œ๋‹ค.

  const user = auth.currentUser;
  const onDelete = async () => {
    const ok = confirm("Are you sure you want to delete this tweet?");
    if (!ok || user?.uid !== userId) return;
    try {
      await deleteDoc(doc(db, "tweets", id));
      if (photo) {
        const photoRef = ref(storage, `tweets/${user.uid}/${id}`);
        await deleteObject(photoRef);
      }
    } catch (error) {
      console.log(error);
    }
  };

 

โœ… where(), orderBy(), limit()


where()๋กœ ์กฐ๊ฑด์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ๋“ค๋งŒ ๋กœ๋”ฉ

orderBy()๋กœ ์ •๋ ฌ

limit()์œผ๋กœ pagination

  useEffect(() => {
    const fetchTweets = async () => {
      const tweetsQuery = query(
        collection(db, "tweets"),
        where("userId", "==", user?.uid),
        orderBy("createdAt", "desc"),
        limit(25)
      );
      const snapshot = await getDocs(tweetsQuery);
      const tweets = snapshot.docs.map((doc) => {
        const { tweet, createdAt, userId, username, photo } = doc.data();
        return {
          tweet,
          createdAt,
          userId,
          username,
          photo,
          id: doc.id,
        };
      });
      setTweets(tweets);
    };
    fetchTweets();
  }, [user?.uid]);

[] dependencies ๋ฐฐ์—ด์— user?.uid๋ฅผ ๋„ฃ์–ด์„œ user๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค useEffect()๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•˜์—ฌ, ์œ ์ € ์ •๋ณด๊ฐ€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธ.

'๐Ÿ”ฅ Firebase' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Firebase - React Native iOS Setup  (0) 2026.02.26
Firebase - Rules  (0) 2025.06.20
Firebase - Hosting  (0) 2025.06.18
Firebase - Firestore Database์™€ Storage์— document์™€ ์‚ฌ์ง„ ์—…๋กœ๋“œํ•˜๊ธฐ  (0) 2025.06.12
Firebase - ์ด๋ฉ”์ผ & ๋น„๋ฐ€๋ฒˆํ˜ธ ๋กœ๊ทธ์ธ๊ณผ ์†Œ์…œ ๋กœ๊ทธ์ธ(Github)  (0) 2025.06.09
'๐Ÿ”ฅ Firebase' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • Firebase - Rules
  • Firebase - Hosting
  • Firebase - Firestore Database์™€ Storage์— document์™€ ์‚ฌ์ง„ ์—…๋กœ๋“œํ•˜๊ธฐ
  • Firebase - ์ด๋ฉ”์ผ & ๋น„๋ฐ€๋ฒˆํ˜ธ ๋กœ๊ทธ์ธ๊ณผ ์†Œ์…œ ๋กœ๊ทธ์ธ(Github)
j2yonghwa
j2yonghwa
Trying to be a fullstack developer ๐Ÿš€
  • j2yonghwa
    j2yonghwa
    j2yonghwa
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (156)
      • โฐ Daily WakaTime (1)
      • ๐Ÿ–๏ธ ๋…ธ๋งˆ๋“œ์ฝ”๋” (2)
      • ๐Ÿบ Dev Setup (3)
      • ๐Ÿ”ญ Tech Info (1)
      • ๐Ÿšซ Error (1)
      • ๐Ÿ“‚ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (23)
      • ♣๏ธ Next.js 14 (10)
      • ♠๏ธ Next.js 12 (20)
      • ๐Ÿ›ธ React Native (12)
      • ๐Ÿฆ‹ TypeScript (1)
      • ๐Ÿ Python (2)
      • ๐ŸŒŠ TailwindCSS (4)
      • ๐Ÿงฉ SQL (25)
      • ๐Ÿ’Ž Prisma (5)
      • ๐ŸŒฑ MongoDB (4)
      • ๐ŸŽฏ Redis (1)
      • ๐Ÿงฌ GraphQL (2)
      • ๐Ÿ”ฅ Firebase (7)
      • ๐Ÿ’ธ Third-Party Services (2)
      • ๐Ÿ•ธ๏ธ Web (1)
      • ๐Ÿ† ์ฝ”๋”ฉํ…Œ์ŠคํŠธ (23)
      • ๐Ÿ“™ ๋ชจ๋”ฅ๋‹ค (5)
      • ๐Ÿ“— ์ฝ”ํ…Œ ํ•ฉ๊ฒฉ์ž ๋˜๊ธฐ -JS- (0)
      • ๐Ÿ“˜ ํด๋ฆฐ์ฝ”๋“œ (0)
      • ๐Ÿฏ ๊ฟ€ํŒ ๐Ÿ (1)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

    • ๊นƒํ—™
  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    react router
    React Native
    ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ
    SQL
    PostgreSQL
    mongoDB
    next.js 14
    ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
    Prisma
    Python
    ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์ž…๋ฌธ
    MySQL
    Firebase
    next.js 12
    dev setup
    tailwindcss
    ๋ชจ๋”ฅ๋‹ค
    0๋ ˆ๋ฒจ
    Next.js
    API
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
j2yonghwa
Firebase - query(), getDocs(), onSnapshot()์„ ์‚ฌ์šฉํ•ด Firestore DB์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”