๊ทธ๋์ ๋ ํ์ฌ ํธ์์ ๋ ๋ฆฌ๋ฉด ๋ฐ๋ก๋ฐ๋ก ํ๋ฉด์ ๋ณด์ฌ์ง์ง ์๊ณ ์๋ก๊ณ ์นจํด์ผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฐ์์์ ํธ์์ ๋ ๋ฉํ๋ค.
์๋ก ์์ฑ๋๋ ํธ์์ด ์ค์๊ฐ์ผ๋ก ๋ณด์ฌ์ง๊ฒ ๋ง๋ค์ด ๋ณด์.
๊ทธ๋ฌ๊ธฐ ์ํด์๋ ์ฝ๋๋ฅผ ์ข ๋ง์ด ์์ ํด์ผ ํ๋ค.(๋๋ฌผ๐ฅฒ)
onSnapshot()๋ฉ์๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ณํ๋ฅผ ์ค์๊ฐ์ผ๋ก ์๋ ค์ค๋ค.
- ๋ฐ๋ผ์
onSnapshot()๋ฉ์๋๋ก Document๋ฅผ ์์ (listen)ํ ์ ์๋ค.- ์ ๊ณตํ ์ฝ๋ฐฑ์ ์ฌ์ฉํ ์ด๊ธฐ ํธ์ถ์ ๋จ์ผ Document์ ํ์ฌ ๋ด์ฉ์ ํฌํจํ Document ์ค๋ ์ท์ ์ฆ์ ์์ฑํ๋ค.
- ๊ทธ๋ฐ ๋ค์ ๋ด์ฉ์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค, ๋ค๋ฅธ ํธ์ถ์ด Document ์ค๋ ์ท์ ์ ๋ฐ์ดํธํ๋ค.
//๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ญ๊ฐ ํ๊ฒ ๋๋ฉด ์ ์ ์๋๋ก ์ฝ์์ ์ฐ์ด๋ณด์!
useEffect(() => {
getTweets();
const q = query(collection(dbService, "tweets"));
onSnapshot(q, (snapshot) => {
console.log("Something happen!");
});
}, []);
ํ์ด์ง๊ฐ ๋ ๋๋๋ฉด ์ฝ์์ "Something happen!"๊ฐ ์ฐํ๋ค.

ํธ์ ๋ด์ฉ์ ์
๋ ฅํ ๋ "Something happen!"์ด ํ ๋ฒ ๋ ์ฐํ๊ณ ,
์
๋ ฅ ํ "Something happen!"์ด ํ ๋ฒ ๋ ๋ฌ๋ค.

๋ฆฌ๋ ๋๋ง ๊ตณ์ด ํ์ ์๋๋ฐ ๊ณ์ ๋๊ณ ์๊ธฐ ๋๋ฌธ์ ์ค๋๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ธฐ์กด์ forEach()์์ ์๋ก ์์ฑ/๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ๋ ์๋ก๊ณ ์นจํด ๋ฐ์๋๋ map()์ผ๋ก ์ฝ๋๋ฅผ ์์ ํ์!
- ๊ตฌ๋ฐฉ๋ฒ
forEach๋ก ๋คํ๋จผํธ ๋์ด//ํธ์ ๋ฐ๋ ๋ฐฉ๋ฒ const getTweets = async () => { /*1. DB์์ ์ปฌ๋ ์ ๊ฐ์ ธ์ค๊ธฐ dbService์ ์๋ tweets ์ปฌ๋ ์ ์ ๊ฐ์ ธ์ค๋ ์ฟผ๋ฆฌ ๋ง๋ค๊ธฐ*/ const q = query(collection(dbService, "tweets")); /*2. ์ปฌ๋ ์ ์ ๋คํ๋จผํธ ๋ชจ๋ ๊ฐ์ ธ์ค๊ธฐ - ์ฟผ๋ฆฌ๋ฅผ ์คํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ QuerySnapshot์ผ๋ก ๋ฐํํ๋ฉด tweets ์ปฌ๋ ์ ์ document๋ค์ ์ป๋๋ค. - ๋ฐ๋ผ์ querySnapshot์ tweets ์ปฌ๋ ์ ์ document๋ค์ ๋ชจ์๋์ ๋ฐฐ์ด์ด๋ค.*/ const querySnapshot = await getDocs(q); //3. ๊ฐ๊ฐ์ ๋คํ๋จผํธ๋ฅผ ๋์ด querySnapshot.forEach((document) => { /*๊ฐ๊ฐ์ ๋คํ๋จผํธ๋ฅผ ๋์ดํ ๋ {data, id} ์ค๋ธ์ ํธ ํํ๋ก ๋์ดํ์. - document์ data๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด data() ๋ฉ์๋ ์ฌ์ฉ - ํธ์ ํ๋์ฉ ๋์ด ํ ๋ ์ธ key ๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์ id ํ ๋น*/ const tweetObj = { ...document.data(), id: document.id, }; //- setTweets() ๋ชจ๋ํ์ด์ด๋ก ์ด์ tweets(prev)์ ๋ํด, ์๋ก์ด ๋ฐฐ์ด(์๋ก ์์ฑํ ํธ์๊ณผ, ...๊ทธ ์ด์ ๊ฒ๋ค)์ ๋ฆฌํดํด์ฃผ์. setTweets((prev) => [tweetObj, ...prev]); }); }; // //4. ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ๋๋ฉด useEffect()์ฌ์ฉ useEffect(() => { getTweets(); const q = query(collection(dbService, "tweets")); onSnapshot(q, (snapshot) => { console.log("Something happen!"); }); }, []);
- ์ ๋ฐฉ๋ฒ
map์ผ๋ก ๋์ด: ๋ฆฌ๋ ๋ ์๋๊ณ ํ ๋ฒ๋ง ๋ฐ์ (๋ ํจ์จ์ )
import React, { useEffect, useState } from "react";
import { dbService } from "fbase";
import {
collection,
addDoc,
serverTimestamp,
query,
onSnapshot,
orderBy,
} from "firebase/firestore";
//App > Router > Home ์์ผ๋ก ๋ณด๋ธ ๋ก๊ทธ์ธํ ์ ์ ์ ๋ณด prop์ผ๋ก ๋ฐ๊ธฐ
const Home = ({ userObj }) => {
//ํ์์ ํธ์ ๋ด์ฉ ์์ฑํ๋ ํผ
const [tweet, setTweet] = useState("");
//0. ์์ฑํ ํธ์ ๊ฐ์ ธ์ค๊ธฐ: ๊ธฐ๋ณธ ๊ฐ์ ๋น ๋ฐฐ์ด
const [tweets, setTweets] = useState([]);
//๐ฅํธ์ ๊ฐ์ ธ์ค๊ธฐ: map์ผ๋ก
useEffect(() => {
//snapshot์ ์ฟผ๋ฆฌ ๊ฐ์ ๊ฑด๋ฐ docs๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
//tweets์ ํ์ด์ง๋ฅผ ๋ถ๋ฌ์ฌ ๋ snapshot์์ ๋์ค๋ ๊ฑฐ๋ค.
//๋ฐ๋ผ์ setTweets()์
const q = query(
collection(dbService, "tweets"),
orderBy("createdAt", "desc")
);
const unsubscribe = onSnapshot(q, (snapshot) => {
//๋ชจ๋ docs๋ {} ์ค๋ธ์ ํธ ๋ฐํํ๋๋ก
//์์ด๋ ๊ฐ์ ธ์ค๊ณ , ๊ทธ๋ฆฌ๊ณ ๋๋จธ์ง ๋ฐ์ดํฐ ์ ์ฒด ๊ฐ์ ธ์ค๊ธฐ
const tweetArr = snapshot.docs.map((doc) => ({
id: doc.id,
...doc.data(),
}));
//ํธ์์ด๋ ์ด ํ์ธํด๋ณด์. ์ค์ผ์ด ์ํ๋๋๋ก ํฌ๋งท๋๊ฒ์ ํ์ธํ ์ ์๋ค!
console.log(tweetArr);
setTweets(tweetArr);
});
return () => {
unsubscribe();
};
}, []);
const onSubmit = async (event) => {
event.preventDefault();
//ํธ์ํ๊ธฐ ๋๋ฅด๋ฉด ์๋ก์ด document ์์ฑํ๊ธฐ
try {
const docRef = await addDoc(collection(dbService, "tweets"), {
//ํธ์ ์์ฑ์
creatorId: userObj.uid,
text: tweet, //tweet(value๋ก tweet state ๊ฐ)
createdAt: serverTimestamp(), //Date.now(),๋ก ํด๋ ๋์ง๋ง ์ด์ ์๋๊ฑฐ ํจ ์จ๋ณด์(ํ์์กด ๋๋ถ์3 = ์์ธ๋ก ์ค์ ๋์ด ์์)
});
//console.log("Document written with ID: ", docRef.id);
} catch (error) {
console.error("Error adding document: ", error);
}
//state ๋น์์ form ๋น์ฐ๊ธฐ
setTweet("");
};
const onChange = (event) => {
const {
target: { value },
} = event;
setTweet(value);
//console.log(tweet);
};
return (
<>
<div>
<form onSubmit={onSubmit}>
<input
type="text"
placeholder="๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์?"
maxLength={120}
value={tweet}
onChange={onChange}
/>
<input type="submit" value="ํธ์ํ๊ธฐ" />
</form>
</div>
{/*DB์์ ๊ฐ์ ธ์จ ํธ์ํฐ ๋์ด*/}
<div>
{tweets.map((tweet) => (
//tweetObj ๋ง๋ค ๋ ๊ฐ๊ฐ์ tweet์ ํ ๋นํ id ๊ฐ์ div์ key์ ๋ฃ์ด์ฃผ์
<div key={tweet.id}>
<h4>{tweet.text}</h4>
</div>
))}
</div>
</>
);
};
export default Home;