๐Ÿœ ํ”„๋กœํ•„ ์—…๋ฐ์ดํŠธ ์˜ค๋ฅ˜

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

๐ŸŒŸ Twinkle (React, Firebase)

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

โš ๏ธ ๋ฌธ์ œ ๋ฐœ์ƒ!

ํ”„๋กœํ•„์—์„œ ์œ ์ €๋ช… ์—…๋ฐ์ดํŠธ ์‹œ ํ—ค๋”์— ์ ํžŒ ์œ ์ €๋ช…์ด ๋ฐ”๋กœ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค.

ํ”„๋กœํ•„ ์œ ์ €๋ช… ์—…๋ฐ์ดํŠธ๋Š” updateProfile() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•˜์—ฌ userObj๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๊ณ  ์žˆ๋‹ค.
์ด๋Š” firebase์— ์žˆ๋Š” ์œ ์ € ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
์ด์— ๋ฐ˜ํ•ด ํ—ค๋”์˜ ๋„ค๋น„๊ฒŒ์ด์…˜์— ์ ํžŒ ์œ ์ €๋ช…์€ prop์œผ๋กœ userObj(App.js์— ๋งŒ๋“ค์–ด๋‘” state useObj) ์ฆ‰ ๋ฆฌ์•กํŠธ๋ฅผ ๋ฆฌ์Šค๋‹ํ•˜๊ณ  ์žˆ๋‹ค.

authService.currentUser.uid ์ด๋Ÿฐ์‹์œผ๋กœ๋„ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๋Š”๋ฐ ์™œ ๊ตณ์ด userObj๋ฅผ prop์œผ๋กœ ์—ฌ๊ธฐ์ €๊ธฐ ๊ณต์œ ํ•˜๋ฉฐ ์‚ฌ์šฉํ•˜๋ƒ๋ฉด ์†Œ์Šค๋ฅผ ํ•˜๋‚˜๋กœ ํ†ต์ผํ•˜๊ณ  ์‹ถ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด userObj์˜ ์ •๋ณด ๋ณ€ํ™”๋งŒ์œผ๋กœ๋„ ์ „์ฒด์— ์˜ํ–ฅ์„ ์ค„์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ๋ก ์ ์œผ๋กœ ๋” ๊น”๋”ํ•˜๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

userObj๋Š” App.js์—์„œ ์‹œ์ž‘๋œ๋‹ค.
๊ทธ๋‹ค์Œ ๋ผ์šฐํ„ฐ๋กœ ๋ณด๋‚ด์ ธ์„œ > home / profile / navigation์— ์ ์šฉ๋œ๋‹ค.

์—ฌ๊ธฐ์„œ ์ž ๊น ๋ฆฌ์•กํŠธ์˜ ํŠน์ง•์„ ์ƒ๊ฐํ•ด๋ณด์ž.
๋ฆฌ์•กํŠธ๋Š” ์ƒˆ๋กœ์šด ์ •๋ณด๋ฅผ ์ ์šฉํ•˜๊ฑฐ๋‚˜ ์ƒํƒœ์˜ ๋ณ€ํ™”๊ฐ€ ์žˆ์„ ๋•Œ ์ƒˆ ์ •๋ณด๋ฅผ ์ธ์‹ํ•œ ํ›„ ๋ชจ๋“  ์š”์†Œ๋ฅผ ๋ฆฌ๋ Œ๋”๋งํ•œ๋‹ค!
์ฆ‰, userObj์— ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ์ ์šฉ์‹œํ‚ค๋ฉด ์ „์ฒด์— ๋ณ€ํ™”๋ฅผ ์ค„ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด user๋ฅผ ์ƒˆ๋กœ๊ณ ์นจํ•ด์ฃผ๋Š” ์ƒˆ๋กœ์šด function์„ ๋งŒ๋“ค์–ด ๋ณด์ž.

๐Ÿ“ src > components > App.js

onAuthStateChanged(auth, async (user) => {
      if (user) {
        if (user.displayName === null) {
          await updateProfile(user, { displayName: "์œ ์ €" });
        }
        //๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ user ์˜ค๋ธŒ์ ํŠธ๋ฅผ userObj ์ƒํƒœ์— ๋„ฃ์–ด ์ฃผ์ž.
        setUserObj(user);
      } else {
        setUserObj(null);
      }
      //์ดˆ๊ธฐํ™”
      setInit(true);
    });
  }, []);

  //๐Ÿ”ฅ user ์ƒˆ๋กœ๊ณ ์นจํ•˜๋Š” ๊ธฐ๋Šฅ: firebase์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  react.js์˜ userObj ์—…๋ฐ์ดํŠธ ํ•˜๊ธฐ
  const refreshUser = async () => {
    const user = authService.currentUser;
    setUserObj(Object.assign({ ...user }));
  };


//
return(
  <>
    {init ? (
        <AppRouter
          isLoggedIn={Boolean(userObj)}
          userObj={userObj}
          refreshUser={refreshUser}
        />
      //

๐Ÿ“ src > components > Router.js

//
const AppRouter = ({ refreshUser, isLoggedIn, userObj }) => {
  //
  return (
    //
    <Route
      path="/profile"
      element={<Profile userObj={userObj} refreshUser={refreshUser} />}
      ></Route>
    //

๐Ÿ“ src > routes > Profile.js

//
const Profile = ({ refreshUser, userObj }) => {
  //
  
  const onSubmit = async (event) => {
    event.preventDefault();
    //1. firebase์— ์žˆ๋Š” profile ์—…๋ฐ์ดํŠธ
    if (userObj.displayName !== newDisplayName) {
      await updateProfile(userObj, {
        displayName: newDisplayName,
      });
      //2. ๊ทธ๋Ÿฌ๊ณ  ๋‚˜์„œ react.js์— ์žˆ๋Š” ์œ ์ €๋ช…๋„ ์ƒˆ๋กœ๊ณ ์นจ๋˜๊ฒŒ ํ•˜๊ธฐ
      refreshUser();
    }
  };

์•„.. ์˜ค๋ฅ˜ ์—†์ด ์ž˜๋˜๋Š”์ค„ ์•Œ์•˜๋Š”๋ฐ ์›ฌ๊ฑธ..
์œ ์ €๋ช…์„ ํ•œ ๋ฒˆ ๋” ๋ฐ”๊พธ๋ ค๊ณ  ํ•˜๋‹ˆ ์ด๋Ÿฐ ์˜ค๋ฅ˜๊ฐ€ ๊ณ„์† ๋œฌ๋‹ค.

โš ๏ธ Uncaught (in promise) TypeError: userInternal.getIdToken is not a function.

์ผ๋‹จ ๋‹ค๋ฅธ ๋งŽ์€ ๋ถ„๋“ค์ด ์‹œ๋„ํ•œ๋Œ€๋กœ onSubmit ํŽ‘์…˜์—์„œ updateProfile ๋Œ€์ƒ์„ authService.currentUser๋กœ ํ•ด์„œ ํ•ด๋ณด๋‹ˆ ์ฝ”๋“œ๊ฐ€ ์•„์ฃผ ์ž˜ ๋Œ์•„๊ฐ€๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ ๋ณด์˜€๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ๋‚ด ๋ชฉ์ ๋Œ€๋กœ์ธ userObj๋ฅผ ๊ฐ–๋‹ค๊ฐ€ ์“ฐ์ง€๋ฅผ ๋ชปํ•˜๋‹ˆ ๋ญ”๊ฐ€ ์•„๋‹Œ๊ฑฐ ๊ฐ™์•„์„œ ๋‹จ๊ณ„๋ณ„๋กœ ์ฝ˜์†”์„ ์ฐ์–ด๋ณด๋‹ˆ ์•„๋‹ˆ๋‚˜ ๋‹ค๋ฅผ๊นŒ ์ฒซ ๋ฒˆ์งธ ๋ณ€๊ฒฝ ์ดํ›„, ๋‘ ๋ฒˆ์งธ ์œ ์ €๋ช… ๋ณ€๊ฒฝ ๋•Œ ๋ถ€ํ„ฐ๋Š” auth์˜ currentUser๋Š” ๋ฐ”๋กœ๋ฐ”๋กœ ์ž˜ ๋ณ€๊ฒฝ๋˜์ง€๋งŒ userObj๋Š” ํ•œ ๋ฐ•์ž ๋Šฆ๊ฒŒ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

์ด๊ฑด ๋‚ด๊ฐ€ ์›ํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ์—ฌ.. ใ… ใ… ใ… ใ…  ์—ใ…‡์—‰์—‰
ํ•˜๋˜ ๋„์ค‘ ์–ด๋–ค ์œ ์ €์˜ ๋Œ“๊ธ€์„ ๋ณด๊ณ  ๊ทธ๋ƒฅ ๋‚˜๋„ ์ด๋ ‡๊ฒŒ ํ•ด์•ผ ๊ฒ ๋‹ค ์‹ถ์–ด์„œ ์ผ๋‹จ ์š”๋ ‡๊ฒŒ ํ•˜๊ณ  ๋„˜์–ด๊ฐ€๊ธฐ๋กœ ํ–ˆ๋‹ค.

๊ทธ๋ƒฅ ์ž„์˜๋กœ ๋ฆฌ๋ Œ๋”๋ง ํ•œ๋ฒˆ ๋” ์‹œ์ผœ์„œ ๋งž์ถฐ๋ฒ„๋ฆฌ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

์ด๋ ‡๊ฒŒ.

๐Ÿ“ src > components > App.js

  //์˜ค๋กœ์ง€ refresh๋งŒ์„ ์œ„ํ•œ state
  const [, setNewName] = useState("");

  const refreshUser = async () => {
    setNewName(userObj.displayName);
  };

๋‚˜์ค‘์— ์™œ userInternal.getIdToken is not a function ์˜ค๋ฅ˜๊ฐ€ ๋œจ๋Š”์ง€๋‚˜ ์•Œ์•„๋ด์•ผ ๊ฒ ๋‹ค. ์ง€๊ธˆ ๋‚ด ์ง€์‹์œผ๋กœ๋Š” ํ•œ๊ณ„์— ๋„˜๋‚˜๋ฆฌ ๋ถ€๋”ชํžˆ๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋‹จ ๋„˜์–ด๊ฐ„๋‹ค...ํ›„ ใ… ใ… ...

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

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