๐ŸŒŸ ์—ฌ๊ธฐ๊นŒ์ง€ Recap

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

๐ŸŒŸ Twinkle (React, Firebase)

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

Recap


Auth ์ดํ›„๋กœ ์ง„ํ–‰ํ•œ ์‚ฌํ•ญ ๋ณต์Šต!

  1. ํ˜„์žฌ Home์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” userObj๋Š” ์–ด๋””์—์„œ ์˜จ ๊ฑธ๊นŒ?
  • userObj๋Š” Home์˜ props์—์„œ ์˜จ๋‹ค.
  • Home์˜ props๋Š” Router์œผ๋กœ๋ถ€ํ„ฐ ๋ฐ›๋Š”๋‹ค.
  • Router๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜(App.js)์œผ๋กœ๋ถ€ํ„ฐ props๋ฅผ ๋ฐ›๋Š”๋‹ค.
  1. App์€ useEffect()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ onAuthStateChanged ๊ด€์ฐฐ์ž๋กœ state์˜ ๋ณ€ํ™”๋ฅผ ๊ด€์ฐฐํ•œ๋‹ค.
    state ๋ณ€ํ™”๋Š” ๋กœ๊ทธ์ธ/๋กœ๊ทธ์•„์›ƒ ํ•  ๋•Œ ์ผ์–ด๋‚œ๋‹ค.

๐Ÿ“ components/App.js

function App() {
  //firebase๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์„ ์ดˆ๊ธฐํ™”ํ•˜๊ธธ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ๋‚˜์„œ isLoggedIn์ด ๋ฐ”๋€Œ๊ฒŒ ํ•ด์•ผ ํ•œ๋‹ค.
  const [init, setInit] = useState(false);
  
  //๋กœ๊ทธ์ธํ–ˆ๋Š”์ง€ ์•ˆํ–ˆ๋Š”์ง€
  const [isLoggedIn, setIsLoggedIn] = useState(false);

  //๋กœ๊ทธ์ธํ•œ ์œ ์ € ์ •๋ณด ๋‹ด์€ ์˜ค๋ธŒ์ ํŠธ state, ๋””ํดํŠธ ๊ฐ’์€ ์ผ๋‹จ ์•„๋ฌด๋„ ์—†์œผ๋‹ˆ๊นŒ null
  const [userObj, setUserObj] = useState(null);

  useEffect(() => {
    const auth = getAuth();
    //์œ ์ € ๋ณ€ํ™”๊ฐ€ ์žˆ๋Š”์ง€ listenํ•˜๊ธฐ: onAuthStateChanged๊ด€์ฐฐ์ž ์‚ฌ์šฉ
    //onAuthStateChanged์€ ์ฝœ๋ฐฑ์ด ํ•„์š”ํ•œ๋ฐ, ์ฝœ๋ฐฑ์€ user์ด๋‹ค.
    onAuthStateChanged(auth, (user) => {
      //console.log(user);
      //user๊ฐ€ ์žˆ๋‹ค๋ฉด ๋กœ๊ทธ์ธ ํ•˜๊ณ , ์œ ์ € ์ •๋ณด ์—…๋ฐ์ดํŠธ
      if (user) {
        setIsLoggedIn(true);
        setUserObj(user)
      } else {
        //user๊ฐ€ ์—†์œผ๋ฉด ๋กœ๊ทธ์ธ ์‹คํŒจ
        setIsLoggedIn(true);
      }
      //๊ทธ๋Ÿฌ๊ณ  ๋‚˜์„œ ์ดˆ๊ธฐํ™” ์‹œ์ผœ๋ผ
      //๐Ÿ”ฅ ํ•ญ์ƒ setInit();์€ true๊ฐ€ ๋˜๋„๋ก
      //๐Ÿ”ฅ ์™œ๋ƒํ•˜๋ฉด ์•ฑ์ด ์–ธ์ œ ์‹œ์ž‘ํ•˜๋“  onAuthStateChanged()๊ฐ€ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
      //์•ฑ์ด ์ค€๋น„๋˜๋ฉด ์ดˆ๊ธฐํ™” ํ•ด์ค˜์•ผ ํ•œ๋‹ค.
      setInit(true);
    });
  }, []);

๋กœ๊ทธ์ธ ๋ถ€๋ถ„ ์ˆ˜์ •


user๊ฐ€ ์žˆ์–ด์•ผ ๋กœ๊ทธ์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.
ํ ...๊ทธ๋Ÿฌ๋ฉด isLoggedIn ๋Œ€์‹  userObj์„ Boolean()์— ๋„ฃ์–ด์„œ true/false ๊ฐ€์ ธ์˜ค๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— isLoggedIn์€ ๊ตณ์ด ์—†์–ด๋„ ๋œ๋‹ค.

๐Ÿ“ components/App.js

//์ ˆ๋Œ€ ๊ฒฝ๋กœ(absolute import)
import AppRouter from "components/Router";
import { useEffect, useState } from "react";
//์ ˆ๋Œ€ ๊ฒฝ๋กœ(absolute import)
//fbase์—์„œ authService ๊ฐ€์ ธ์˜ค๊ธฐ(export๋กœ ๋‚ด๋ณด๋ƒˆ๊ธฐ ๋•Œ๋ฌธ์— {} ์ค‘๊ด„ํ˜ธ ์ณ์„œ ๊ฐ€์ ธ์™€์•ผ ํ•จ)
import { getAuth, onAuthStateChanged } from "firebase/auth";

function App() {
  //firebase๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์„ ์ดˆ๊ธฐํ™”ํ•˜๊ธธ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ๋‚˜์„œ isLoggedIn์ด ๋ฐ”๋€Œ๊ฒŒ ํ•ด์•ผ ํ•œ๋‹ค.
  const [init, setInit] = useState(false);

  //๐Ÿ”ฅ isLoggedIn์€ ๊ตณ์ด ์—†์–ด๋„ ๋ ๊ฒƒ ๊ฐ™๋‹ค. 
  //์ธ์ฆ์„œ๋น„์Šค์˜ ํ˜„์žฌ ์œ ์ €๊ฐ€ ์ฐธ์ธ์ง€ ๊ฑฐ์ง“์ธ์ง€์— ๋”ฐ๋ผ (๋กœ๊ทธ์ธํ–ˆ๋Š”์ง€ ์•ˆํ–ˆ๋Š”์ง€์— ๋”ฐ๋ผ)state ๋‹ฌ๋ผ์ง
  //const [isLoggedIn, setIsLoggedIn] = useState(false);

  //๋กœ๊ทธ์ธํ•œ ์œ ์ € ์ •๋ณด ๋‹ด์€ ์˜ค๋ธŒ์ ํŠธ state, ๋””ํดํŠธ ๊ฐ’์€ ์ผ๋‹จ ์•„๋ฌด๋„ ์—†์œผ๋‹ˆ๊นŒ null
  const [userObj, setUserObj] = useState(null);

  //์–ด๋–ป๊ฒŒ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์žˆ์„๊นŒ? useEffect()๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค ใ…‡ใ…‡!
  useEffect(() => {
    const auth = getAuth();
    //์œ ์ € ๋ณ€ํ™”๊ฐ€ ์žˆ๋Š”์ง€ listenํ•˜๊ธฐ: onAuthStateChanged๊ด€์ฐฐ์ž ์‚ฌ์šฉ
    //onAuthStateChanged์€ ์ฝœ๋ฐฑ์ด ํ•„์š”ํ•œ๋ฐ, ์ฝœ๋ฐฑ์€ user์ด๋‹ค.
    onAuthStateChanged(auth, (user) => {
      //console.log(user);
      //๐Ÿ”ฅ user๊ฐ€ ์žˆ๋‹ค๋ฉด ๋กœ๊ทธ์ธํ•œ ์œ ์ € ์ •๋ณด userObj์— ์—…๋ฐ์ดํŠธ, ๋กœ๊ทธ์•„์›ƒํ•˜๋ฉด null
      user ? setUserObj(user) : setUserObj(null);
      //๊ทธ๋Ÿฌ๊ณ  ๋‚˜์„œ ์ดˆ๊ธฐํ™” ์‹œ์ผœ๋ผ
      setInit(true);
    });
  }, []);
  //Router ๋ Œ๋”ํ•˜๊ธฐ & AppRouter์— prop ์ „๋‹ฌํ•˜๊ธฐ
  return (
    <>
      {/*init์ด ๊ฑฐ์ง“์ด๋ฉด ๋ผ์šฐํ„ฐ ์ˆจ๊ธฐ๊ณ  ์ดˆ๊ธฐํ™” ์ค‘์ด๋ผ๊ณ  ๋„์šฐ๊ธฐ*/}
      {/*๋กœ๊ทธ์ธํ•œ user ์ •๋ณด AppRouter๋กœ ๋ณด๋‚ด๊ธฐ*/}
      {init ? (
        {/*๐Ÿ”ฅ ์•„์— userObj๊ฐ€ ์žˆ๋Š”์ง€ ์—†๋Š”์ง€ ๋ถˆ๋ฆฌ์–ธ ๊ฐ’์„ ๋ณด๋‚ด์ž*/}
        <AppRouter isLoggedIn={Boolean(userObj)} userObj={userObj} />
      ) : (
        "์ดˆ๊ธฐํ™”์ค‘..."
      )}
      <footer>&copy; twinkle {new Date().getFullYear()}</footer>
    </>
  );
}

export default App;
profile
Always have hope๐Ÿ€ & constant passion๐Ÿ”ฅ

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