๐Ÿ”ฅ Firestore ์‹ค์‹œ๊ฐ„ ๋ฐ˜์˜ onSnapshot(), query, orderBy (ํŒ€ํ”„๋กœ์ ํŠธ 3์ผ์ฐจ)

๋ฆผ๋ฏผ์ง€ยท2025๋…„ 2์›” 20์ผ

Today I Learn

๋ชฉ๋ก ๋ณด๊ธฐ
6/62

๐Ÿ‘€ ๋Œ“๊ธ€์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ˜์˜ํ•˜์ž

์—ฐ๊ด€ ์ฝ”๋”ฉ ๋งํฌ -
๋Œ“๊ธ€์ด firestore์— add์™€ get์€ ์ž˜๋˜์—ˆ์ง€๋งŒ, addํ•˜์ž๋งˆ์ž ํŽ˜์ด์ง€์— ๋ฐ˜์˜๋˜์ง€ ๋ชปํ–ˆ๋‹ค.
๊ทธ๋ž˜์„œ ๋ฐ”๋กœ๋ฐ”๋กœ ์ถ”๊ฐ€๋˜๋ฉด ์ข‹๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.
์ด๋•Œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด ๋ฐ”๋กœ Firestore์˜ ์‹ค์‹œ๊ฐ„ ๋ฆฌ์Šค๋„ˆ onSnapshot() ์ด๋‹ค!

๐Ÿ’ก onSnapshot์„ ์‚ฌ์šฉํ•˜๋ฉด?

  • Firestore์—์„œ ์‹ค์‹œ๊ฐ„ ์—…๋ฐ์ดํŠธ ๊ฐ์ง€ (onSnapshot())
  • GetDocs ์—†์ด๋„ ๋ฐ์ดํ„ฐ ๋ฐ˜์˜ ๊ฐ€๋Šฅ
  • ์ƒˆ ๋Œ“๊ธ€์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์ž๋™์œผ๋กœ ํ™”๋ฉด์— ๋ฐ˜์˜
  • ๊ธฐ์กด ๋Œ“๊ธ€๋„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์—…๋ฐ์ดํŠธ

๊ธฐ์กด js ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ† ๋ง ํ•ด๋ณด์ž

๐Ÿฝ ๊ธฐ์กด ์ฝ”๋“œ

๋‚˜๋Š” commenting์ด๋ผ๋Š” ์ฝœ๋ž™์…˜ ์•ˆ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ฐ€์ ธ์™”์—ˆ๋‹ค.

$(document).ready(async function () {

    let docs = await getDocs(collection(db, "commenting"));
    docs.forEach((doc) => {
      let commentData = doc.data();
      let temp_html = `<div class="speech-bubble">${commentData.text}</div>`;
      $(".commentList").append(temp_html);
  
  });
  //addDoc ์ƒ๋žต
 });

์œ„์˜ ๋ฐฉ์‹์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ˜์˜๋˜์ง€ ์•Š์•˜๋‹ค.

โœ… onSnapshot ์‚ฌ์šฉ

์šฐ์„  import๋ฅผ ํ•ด์ค˜์•ผ ์“ธ ์ˆ˜ ์žˆ๊ฒ ์ฃ ?

import { onSnapshot } from "https://www.gstatic.com/firebasejs/9.22.0/firebase-firestore.js";

๐Ÿ” ์ฝ”๋“œ ์„ค๋ช…

  1. getDocs ๋Œ€์‹ ์— onSnapshot()์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹ค์‹œ๊ฐ„ ๊ฐ์ง€
  • Firestore์˜ "commenting" ์ปฌ๋ ‰์…˜์„ ๊ฐ์‹œํ•˜๋‹ค๊ฐ€ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์ด ๊ฐ์ง€๋˜๋ฉด ์ž๋™ ์‹คํ–‰๋จ.
  • ์ƒˆ ๋Œ“๊ธ€์ด ์ถ”๊ฐ€๋˜๊ฑฐ๋‚˜ ์‚ญ์ œ๋  ๋•Œ๋งˆ๋‹ค commentList๋ฅผ ์—…๋ฐ์ดํŠธ.
  • addDoc()์„ ์‹คํ–‰ํ•˜๋ฉด ์ฆ‰์‹œ ๋ฐ˜์˜
  • ๋Œ“๊ธ€์„ ์ž…๋ ฅํ•˜๋ฉด Firestore์— ์ €์žฅ๋จ.
  • Firestore์˜ ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•˜๋Š” onSnapshot()์ด ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜์–ด ํ™”๋ฉด์„ ์—…๋ฐ์ดํŠธํ•จ.
  1. ์ƒˆ๋กœ์šด ๋Œ“๊ธ€์ด ๊ฐ€์žฅ ์•„๋ž˜์— ์ถ”๊ฐ€๋˜๋„๋ก ์ •๋ ฌ (timestamp)
  2. timestamp๋ฅผ ์ €์žฅํ•ด์„œ ์‹œ๊ฐ„์ˆœ ์ •๋ ฌ (sort((a, b) => a.data().timestamp - b.data().timestamp))

+์ž…๋ ฅ ํ›„ $("#commenting").val("")๋กœ ์ž…๋ ฅ์ฐฝ ์ดˆ๊ธฐํ™”
->๋Œ“๊ธ€ ์ž‘์„ฑ ํ›„ ์ž…๋ ฅ์ฐฝ์ด ๋น„์›Œ์ง.

//1
onSnapshot(collection(db, "commenting"), (snapshot) => {
    $(".commentList").empty(); // ๊ธฐ์กด ๋ชฉ๋ก ์ดˆ๊ธฐํ™”
	//2, 3
    snapshot.docs
        .sort((a, b) => a.data().timestamp - b.data().timestamp) // ์‹œ๊ฐ„์ˆœ ์ •๋ ฌ
        .forEach((doc) => {
            let commentData = doc.data();
            let temp_html = `<div class="speech-bubble">${commentData.text}</div>`;
            $(".commentList").append(temp_html);
        });
})

๐Ÿ“Œ getDocs() ์—†์–ด๋„ onSnapshot()๋งŒ์œผ๋กœ ๋ ๊นŒ๋‚˜..?

โœ… onSnapshot()์„ ์‚ฌ์šฉํ•˜๋ฉด getDocs() ์—†์ด๋„ Firestore ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค!
โœ… onSnapshot()์€ Firestore ๋ฐ์ดํ„ฐ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ฐ์‹œํ•˜๋ฉด์„œ ์ž๋™์œผ๋กœ UI๋ฅผ ์—…๋ฐ์ดํŠธํ•ด ์ฃผ๊ธฐ ๋•Œ๋ฌธ์—, ํŽ˜์ด์ง€ ๋กœ๋”ฉ ํ›„ ๋ณ„๋„๋กœ getDocs()๋ฅผ ์‹คํ–‰ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค!

์™„์„ฑ๋œ ํ™”๋ฉด์„ ํ•œ๋ฒˆ ๋ณด์ž

๋Œ“๊ธ€์ด ์ž˜ ๋‹ฌ๋ฆฌ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค!

๐Ÿ“‚ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ query&orderBy

1. ์‚ฌ์šฉ ์ด์œ 

๋Œ“๊ธ€ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด addํ•˜๊ณ  onSnapshot์œผ๋กœ ์‹ค์‹œ๊ฐ„ ๋ฐ˜์˜๊นŒ์ง€ ๊ตฌํ˜„ํ–ˆ๋Š”๋ฐ, ๋Œ“๊ธ€์ด ์ˆœ์„œ๋Œ€๋กœ ๋ฐฐ์น˜๋˜์ง€ ์•Š๊ณ  ๋žœ๋คํ•œ ์ˆœ์„œ๋กœ ๋ฐฐ์น˜๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
โ†’ ๋Œ“๊ธ€์„ ์˜ค๋ž˜๋œ๊ฑด ์œ„๋กœ, ์ตœ์‹ ๊ฒƒ์ด ์•„๋ž˜์ชฝ์œผ๋กœ ๋ฐฐ์—ด๋˜๊ฒŒ ๋งŒ๋“ค๊ณ  ์‹ถ์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.(์˜ค๋ฆ„์ฐจ์ˆœ ๋ฐฐ์—ด)

2. ํ•ด๊ฒฐ๋ฐฉ์•ˆ

(1) ๋ฐ์ดํ„ฐ๋ฅผ add ํ•  ๋•Œ, timestamp๊ณผ ํ•จ๊ป˜ ์ €์žฅํ•˜์ž

(2) commenting db์—์„œ ๋ชจ๋“  ๋ฌธ์„œ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค

collection(db, "commenting") โ†’ "commenting" ์ปฌ๋ ‰์…˜์—์„œ ๋ชจ๋“  ๋ฌธ์„œ๋ฅผ ๊ฐ€์ ธ์™€.

(3) ๊ฐ€์ ธ์˜จ ๋ฌธ์„œ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌํ•œ๋‹ค

orderBy("timestamp", "asc") โ†’ ๊ฐ€์ ธ์˜จ ๋ฌธ์„œ๋“ค์„ timestamp ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ(asc) ์ •๋ ฌ!

๐Ÿ’ก orderBy("timestamp", "asc")โ†’ ์ž‘์„ฑ๋œ ์‹œ๊ฐ„์ˆœ(์˜ค๋ž˜๋œ ์ˆœ)์œผ๋กœ ์ •๋ ฌ
"asc" (์˜ค๋ฆ„์ฐจ์ˆœ) โ†’ ์˜ค๋ž˜๋œ ๋Œ“๊ธ€์ด ์œ„์ชฝ
"desc" (๋‚ด๋ฆผ์ฐจ์ˆœ) โ†’ ์ตœ์‹  ๋Œ“๊ธ€์ด ์œ„์ชฝ

(4) collection๊ณผ orderby๋ฅผ ๋ฌถ์ž

query()๋ฅผ ํ™œ์šฉํ•ด์•ผ firestore์—์„œ ์กฐ๊ฑด์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‘˜์„ ๋ฌถ์–ด์ฃผ๋Š” ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค

๐Ÿ”ฅ ์ฆ‰, query()๋Š” Firestore์—์„œ ํŠน์ • ์กฐ๊ฑด(์ •๋ ฌ, ํ•„ํ„ฐ ๋“ฑ)์„ ์ ์šฉํ•  ๋•Œ ๊ผญ ํ•„์š”ํ•˜๋‹ค!!

๋ฌถ์€ ์ฟผ๋ฆฌ๋ฅผ const๋กœ ์ •์˜ํ•ด์ฃผ์ž

const q = query(collection(db, "commenting"), orderBy("timestamp", "asc"));

(5) onSnapshot()์— ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ ์šฉํ•ด๋ณด์ž

onSnapshot(q, (snapshot) => {

๋Œ“๊ธ€์ด ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ˜์˜๋˜์–ด์•ผํ•˜๋ฏ€๋กœ snapshot์€ ์œ ์ง€ํ•˜๋˜, ์•„๊นŒ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •์˜ํ•œ ์ฟผ๋ฆฌ q์— ์žˆ๋Š” ๊ฐ’์„ ์จ์•ผํ•˜๋‹ˆ๊นŒ ์œ„์˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ ์ •์˜ํ•˜์ž

๐Ÿš€ query & orderby ์ •๋ฆฌ

โœ” query()๋ฅผ ์‚ฌ์šฉํ•ด์•ผ orderBy() ๊ฐ™์€ ์กฐ๊ฑด์„ Firestore์—์„œ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Œ.
โœ” orderBy("timestamp", "asc")๋กœ ์ •๋ ฌํ•˜๋ฉด ์‹œ๊ฐ„์ˆœ ์ •๋ ฌ์ด ๋จ.

0๊ฐœ์˜ ๋Œ“๊ธ€