๐ŸŒŸ ์ž‘์„ฑ์ž ์ •๋ณด DB์— ๋„ฃ๊ธฐ

summereuna๐Ÿฅยท2022๋…„ 4์›” 3์ผ

๐ŸŒŸ Twinkle (React, Firebase)

๋ชฉ๋ก ๋ณด๊ธฐ
14/42

๋จผ์ € ํŒŒ์ด์–ด์Šคํ† ์–ด์—์„œ ์ด์ „์— ์ž‘์„ฑํ•œ ํŠธ์œ— ๋ชจ๋‘ ์ง€์šฐ๊ณ  ์‹œ์ž‘ํ•˜์ž!

ํŠธ์œ— ์ž‘์„ฑ์ž ์ •๋ณด ๋„ฃ๊ธฐ


ํŠธ์œ—์„ ๋ˆ„๊ฐ€ ํ–ˆ๋Š”์ง€ ์•Œ๊ธฐ ์œ„ํ•ด ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ๋ฐ›์•„์™€์•ผ ํ•œ๋‹ค.
App.js์—์„œ ๋ชจ๋“  auth๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฒ˜๋ฆฌํ•˜์ž.

  • App.js > Router.js > Home.js์œผ๋กœ prop์œผ๋กœ ์œ ์ € ์ •๋ณด๋ฅผ ๋ณด๋‚ด์ฃผ์ž.

๐Ÿ“ App.js


  1. useState()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๊ทธ์ธํ•œ ์œ ์ € ์ •๋ณด๋ฅผ ๋‹ด๋Š” ์˜ค๋ธŒ์ ํŠธ state๋ฅผ ๋งŒ๋“ ๋‹ค. ๋””ํดํŠธ ๊ฐ’์€ ์ผ๋‹จ ์•„๋ฌด๋„ ์—†์œผ๋‹ˆ๊นŒ null๋กœ ํ•˜๋ฉด ๋œ๋‹ค.

    • const [userObj, setUserObj] = useState(null);
  2. ๋ชจ๋””ํŒŒ์ด์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๊ทธ์ธํ•œ ์œ ์ € ์ •๋ณด๋ฅผ userObj์— ์—…๋ฐ์ดํŠธํ•œ๋‹ค.

    • setUserObj(user);

      function App() {
      //์ƒ๋žต
      
      //๐Ÿ”ฅ๋กœ๊ทธ์ธํ•œ ์œ ์ € ์ •๋ณด ๋‹ด์€ ์˜ค๋ธŒ์ ํŠธ state, ๋””ํดํŠธ ๊ฐ’์€ ์ผ๋‹จ ์•„๋ฌด๋„ ์—†์œผ๋‹ˆ๊นŒ null
      const [userObj, setUserObj] = useState(null);
      
      useEffect(() => {
       const auth = getAuth();
       //์œ ์ € ๋ณ€ํ™”๊ฐ€ ์žˆ๋Š”์ง€ listenํ•˜๊ธฐ: onAuthStateChanged๊ด€์ฐฐ์ž ์‚ฌ์šฉ
       //onAuthStateChanged์€ ์ฝœ๋ฐฑ์ด ํ•„์š”ํ•œ๋ฐ, ์ฝœ๋ฐฑ์€ user์ด๋‹ค.
       onAuthStateChanged(auth, (user) => {
         //user๊ฐ€ ์žˆ๋‹ค๋ฉด ๋กœ๊ทธ์ธ ์ฐธ์œผ๋กœ ๋ฐ”๊ฟ”์ฃผ๊ณ , ์•„๋‹ˆ๋ผ๋ฉด ๋กœ๊ทธ์ธ ๊ฑฐ์ง“์œผ๋กœ
         if (user) {
           setIsLoggedIn(true);
           //๐Ÿ”ฅ๋กœ๊ทธ์ธํ•˜๋ฉด ๋กœ๊ทธ์ธํ•œ ์œ ์ € ์ •๋ณด userObj์— ์—…๋ฐ์ดํŠธ
           setUserObj(user);
         } else {
           setIsLoggedIn(false);
         }
         //๊ทธ๋Ÿฌ๊ณ  ๋‚˜์„œ ์ดˆ๊ธฐํ™” ์‹œ์ผœ๋ผ
         setInit(true);
       });
      }, []);
  3. ๋กœ๊ทธ์ธํ•œ ์œ ์ € ์ •๋ณด์ธ userObj๋ฅผ prop์œผ๋กœ Router๋กœ ๋ณด๋‚ธ๋‹ค.

    {/*๋กœ๊ทธ์ธํ•œ user ์ •๋ณด AppRouter๋กœ ๋ณด๋‚ด๊ธฐ*/}
    <AppRouter isLoggedIn={isLoggedIn} userObj={userObj} />

๐Ÿ“ Router.js


  1. AppRouter์—์„œ ๋กœ๊ทธ์ธํ•œ ์œ ์ € ์ •๋ณด์ธ userObj๋ฅผ ๋ฐ›๋Š”๋‹ค.

    //๐Ÿ”ฅ๋กœ๊ทธ์ธํ•œ ์œ ์ € ์ •๋ณด userObj ๋ฐ›๊ธฐ
    const AppRouter = ({ isLoggedIn, userObj }) => {
    //...
    };
    //...
  2. ๋กœ๊ทธ์ธํ•œ ์œ ์ €์ •๋ณด(userObj)๋ฅผ prop์œผ๋กœ Home์ปดํฌ๋„ŒํŠธ์— ๋ณด๋‚ธ๋‹ค.

    {/*๐Ÿ”ฅ๋กœ๊ทธ์ธํ•œ ์œ ์ €์ •๋ณด(userObj)๋ฅผ prop์œผ๋กœ Home์ปดํฌ๋„ŒํŠธ์— ๋ณด๋‚ด๊ธฐ*/}
    <Route path="/" element={<Home userObj={userObj} />}></Route>

๐Ÿ“ Home.js


  1. Home์—์„œ ๋กœ๊ทธ์ธํ•œ ์œ ์ € ์ •๋ณด์ธ userObj๋ฅผ ๋ฐ›๋Š”๋‹ค.

    const Home = ({ userObj }) => {
    //...
    }
  2. onSubmit ํ•ธ๋“ค๋Ÿฌ์—์„œ ํŠธ์œ—ํ•˜๊ธฐ ๋ˆ„๋ฅด๋ฉด ์ƒˆ๋กœ์šด document๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ถ€๋ถ„์— ํŠธ์œ— ์ž‘์„ฑ์ž(creatorId)์— userObj ์˜ค๋ธŒ์ ํŠธ์˜ uid๋ฅผ ๋„ฃ์–ด ์ฃผ๋ฉด ๋œ๋‹ค.

    • tweet: tweet์ด๋˜ ๋ถ€๋ถ„ text: tweet์œผ๋กœ key ๊ฐ’์„ ์ˆ˜์ •ํ•ด์ฃผ์ž.(ํŽธํ•˜๋ ค๊ณ  ํ•˜๋Š”๊ฑฐ์ž„ ใ…‡ใ…‡!)
    • ๊ทธ๋ฆฌ๊ณ  ๋ Œ๋” ๋˜๋Š” ๋ถ€๋ถ„๋„ <h4>{tweet.text}</h4> ๋ผ๊ณ  ๋ฐ”๊ฟ”์ฃผ์ž.
      const onSubmit = async (event) => {
      event.preventDefault();
      //ํŠธ์œ—ํ•˜๊ธฐ ๋ˆ„๋ฅด๋ฉด ์ƒˆ๋กœ์šด document ์ƒ์„ฑํ•˜๊ธฐ
      try {
       const docRef = await addDoc(collection(dbService, "tweets"), {
         //๐Ÿ”ฅํŠธ์œ— ์ž‘์„ฑ์ž์— userObj ์˜ค๋ธŒ์ ํŠธ์˜ uid๋ฅผ ๋„ฃ์–ด ์ฃผ๋ฉด ๋œ๋‹ค.
         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("");
      };

profile
Always have hope๐Ÿ€ & constant passion๐Ÿ”ฅ

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