
โ 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 |