Auth ์ดํ๋ก ์งํํ ์ฌํญ ๋ณต์ต!
onAuthStateChanged ๊ด์ฐฐ์๋ก state์ ๋ณํ๋ฅผ ๊ด์ฐฐํ๋ค.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์ ๊ตณ์ด ์์ด๋ ๋๋ค.
//์ ๋ ๊ฒฝ๋ก(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>© twinkle {new Date().getFullYear()}</footer>
</>
);
}
export default App;