ํ๊ณ ๋ก๊ฐ์ ๊ฒ์ ์จ๋ณด๊ฒ ๋ค๊ณ ์๊ฐ์ด ๋ ์ ์ด ์์ง๋ง ์ฒ์์ผ๋ก ํ๋ฒ ์จ๋ณด๊ณ ์ํ๋ค.
์ด์ ๋ ์ด๋ ํ ํ ๋ฌธ์ ์ ๋ํด์ ๊น์ด ์๊ฐํ๋ฉฐ ํด๊ฒฐํ๋ คํ๋ ๊ณผ์ ๋ค์ ๊ธฐ๋กํด๋๊ณ ์ถ์ด์์ด๋ค.
(์ผํ๋ณด๋ฉด ๋ณ ๊ฒ์ด ์๋ ๋ฌธ์ ์ด์ง๋ง ํ๋ฃจ๋ฅผ ๊ฑฐ์ ๋ค ๋ฐ์ณ์ผ์)
๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ์ํฉ์ ๋ค์๊ณผ ๊ฐ์๋ค.
react-router๋ฅผ ๊ณต๋ถํ๋ฉด์ ๊ณต์ํํ์ด์ง์ ์์ ๋ค์ ๊ณต๋ถํ๋ คํ๋ค.
react router์ ๊ณต์ํํ์ด์ง์ Auth Example์ธ๋ฐ ์ด๋ ๋ด๊ฐ ๊ณต๋ถํ์ง์์ ํ์
์คํฌ๋ฆฝํธ ๋ด์ฉ์ด ์์ฌ์์ด ๊ณต๋ถํ๊ธฐ ์ด๋ ค์ธ ๊ฒ ๊ฐ๋ค๋ ํ๋จ์ด ๋ค์๋ค.
๋๋ react router version 6๋ฅผ ๊ณต๋ถํ๋ ์ค์ด์๊ธฐ์ v6์ผ๋ก authentication๋ฅผ ๊ตฌํํ ์์ ๋ฅผ ์ฐพ๊ณ ์ถ์๋ค.
์ฌ๊ธฐ์ ๊ธฐ ์ฐพ์๋ณด๋ค version6 authentication์ ์ฐพ๊ฒ ๋์ด ๋ณด๋ฉด์ ๊ณต๋ถํ์๋ค.
ํ์ง๋ง ์งํํ๋ฉด์ ๋ฌธ์ ์ ์ด ํ๋ ์๊ฒผ๋ค.
๋ฌธ์ ๋ ๋ค์๊ณผ ๊ฐ์๋ค.
useAuth.js
function useAuth() {
const [authed, setAuthed] = React.useState(false);
return {
authed,
login() {
return new Promise((res) => {
setAuthed(true);
res();
});
},
logout() {
return new Promise((res) => {
setAuthed(false);
res();
});
},
};
}
export function AuthProvider({ children }) {
const auth = useAuth();
return <authContext.Provider value={auth}>{children}</authContext.Provider>;
}
export default function AuthConsumer() {
return React.useContext(authContext);
}
Login.js
import { useNavigate } from "react-router-dom";
import useAuth from "./useAuth";
function Nav() {
const { authed, logout } = useAuth();
const navigate = useNavigate();
const handleLogout = () => {
logout();
navigate("/");
};
return (
<nav>
<ul>
<li>
<Link to="/">Home</Link>
</li>
<li>
<Link to="/pricing">Pricing</Link>
</li>
</ul>
{authed && <button onClick={handleLogout}>Logout</button>}
</nav>
);
}
useAuth๋ ์ฌ์ฉ์๊ฐ ์ธ์ฆ์ํ,๋ก๊ทธ์ธ,๋ก๊ทธ์์ ๊ธฐ๋ฅ์ ๋ด์ฌํ ํจ์์ธ๋ฐ ์ด๋ฅผ ์ฌ๋ฌ ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ๋ ค๋ ์๋์ด๋ค.
ํ์ง๋ง ๋ด๊ฐ ์ฝ๋๋ฅผ ๋ฐ๋ผ์ ๊ตฌํํ์์ ๋ ์คํ๋์ง ์์๋ค.
์ด ๋ฌธ์ ์ ์ ๋ํ์ฌ ๋๋ 2๊ฐ์ง ์๋ฌธ์ ์ ๊ฐ์ก๋ค.
1. useAuth๋ผ๋ ํจ์๋ฅผ exportํ์ง์๋๋ฐ ์ด๋ป๊ฒ ๋ค๋ฅธ ์ปดํฌ๋ํธ์์ useAuth๋ฅผ ๊ฐ์ ธ๋ค์ธ ์ ์๋๊ฒ์ธ๊ฐ?
2. export default function useAuth๋ฅผ ํ์๋คํ๋๋ผ๋ ๋ชจ๋๋ง๋ค์ ์ค์ฝํ๊ฐ ์๊ธฐ๋๋ฌธ์ ์ปดํฌ๋ํธ๋ง๋ค ํด๋น๊ฐ์ด ๋ค๋ฅผํ
๋ฐ ์ด๋ป๊ฒ ์ ์ญ์ ์ผ๋ก ์ธ ์ ์๋๊ฒ์ธ๊ฐ?
1๋ฒ ์๋ฌธ์ ์ ๋ํ์ฌ ๋ต์ ์ฐพ์ง๋ชปํด 2๋ฒ๊ณผ ๊ฐ์ด ๋ณ๊ฒฝํ์๋๋ฐ ์ด์กฐ์ฐจ๋ ํด๊ฒฐํ ์ ์์๋ค.
useAuth๊ฐ ๋ฐํํ๋ ๊ฐ์ ์ ์ญ์ ์ผ๋ก ์ฌ์ฉํ๋๋ฒ์ด ๋ ์ค๋ฅด์ง ์์๋ค.
๊ทธ๋ฆฌํ์ฌ useAuth๊ฐ์ ์ ์ญ์ ์ผ๋ก ์ฐ๊ธฐ ์ํด ํ์ฌ ๋ด๊ฐ ์๋ ๋ฐฉ๋ฒ์ด ๋ฌด์์ด ์์๊น๋ผ๊ณ ๊ณ ๋ฏผํ๋ค๊ฐ ๋ค์๊ณผ ๊ฐ์ด ํด๊ฒฐํ๋ค.
์ต์๋จ ์ปดํฌ๋ํธ(App)์์ useAuthํจ์๋ฅผ ์ ์ํ์ฌ ๋ฐํ๊ฐ๋ค์ prop drilling(ํ์ ์ปดํฌ๋ํธ์ prop์ผ๋ก ๋ด๋ ค์ฃผ๊ธฐ)ํ์๋ค.
์ด๊ฒ์ด ์ ์ ํ ๋ฐฉ๋ฒ์ธ์ง ๋ชจ๋ฅด๊ฒ ์ง๋ง ๋ฌธ์ ๋ฅผ ์ผ๋จ ํด๊ฒฐํ๋ค๋ ๊ฒ์ ๋ํด ๊ธฐ๋ปค๋ค.
์ด์จ๋ ์ง๊ธ๋ ์๋ฌธ์ ์ด ์๋ ์ฝ๋์ด์ง๋ง ๊พธ์คํ ๋ฆฌํฉํ ๋งํ๋ฉฐ ๋ฌด์์ด ๋ ํจ์จ์ ์ธ ์ฝ๋์ธ์ง ํ์ธํ๋ฉฐ ๋ณธ ์์ ์์๋ ์ ์ ๋ ๊ฒ ์ฌ์ฉํ ์ ์์๋์ง ๊ณ ๋ฏผํด๋ด์ผ๊ฒ ๋ค.
์์ ๋ฌธ์ ์์ง๋ง ์ค๋ ์๊ฐ ๊ณต๋ค์ฌ์ ํด๊ฒฐํ๋ค๋๊ฒ์ด ๋ญ๊ฐ ๋ฟ๋ฏํ๋ค.