์ค๋์ ๋ฆฌ์กํธ ํ๋ก์ ํธ๋ฅผ ์์
ํ๋ฉด์ ๋ช ๊ฐ์ง ์๋ก์ด ๊ธฐ์ ๋ค์ ๋ํด์ ์ ๋ฆฌ๋ฅผ ํด๋ณด๋ ค๊ณ ํ๋ค...!
(์ด์ velog ์๋ฒ ํฐ์ ธ์ ์ด์ ์ผ ์ฌ๋ฆฌ๋ ์์์ผ TIL!)
๊ธฐ์กด์ ํญ์ ์ผ๋ BrowserRouter์ ์๋กญ๊ฒ ์๊ฒ ๋ createBrowserRouter์ ์ฐจ์ด์ ์ ๋ฐฐ์ ๋ค.
์์ ์๋ ํญ์ ์ด๋ ๊ฒ ์ผ๋๋ฐ:
<BrowserRouter>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/product/:id" element={<ProductDetail />} />
</Routes>
</BrowserRouter>
createBrowserRouter๋ ๊ฐ์ฒด ์คํ์ผ๋ก ๋ผ์ฐํ ์ ์ค์ ํ ์ ์๋ค:
const router = createBrowserRouter([
{
path: "/",
element: <Home />
},
{
path: "/product/:id",
element: <ProductDetail />,
loader: productLoader,
errorElement: <ErrorPage />
}
]);
์ด ๋ฐฉ์์ ์ง์ง ์ฅ์ ์ loader์ errorElement ๊ฐ์ ์ถ๊ฐ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ค๋ ์ ์ด๋ค. ํนํ loader๋ ํฅ๋ฏธ๋ก์ ๋๋ฐ, ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋๊ธฐ ์ ์ ๋ฐ์ดํฐ๋ฅผ ๋ฏธ๋ฆฌ ๋ถ๋ฌ์ฌ ์ ์์ด์ ๋ก๋ฉ ์ํ ๊ด๋ฆฌ๊ฐ ๋ ํธํด์ง ๊ฒ ๊ฐ๋ค.
loader์์ ๊ฐ์ ธ์จ ๋ฐ์ดํฐ๋ useLoaderData ํ
์ผ๋ก ์ปดํฌ๋ํธ์์ ๋ฐ๋ก ์ฌ์ฉํ ์ ์๋ค:
function ProductDetail() {
const product = useLoaderData();
// ์ด๋ฏธ ๋ฐ์ดํฐ๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋ก๋ฉ ์ํ๋ฅผ ๋ฐ๋ก ๊ด๋ฆฌํ ํ์๊ฐ ์๋ค
return (
<div>
<h1>{product.name}</h1>
<p>{product.price}์</p>
</div>
);
}
์ด๋ ๊ฒ ํ๋ฉด useEffect์ useState๋ก ๋ฐ์ดํฐ ํ์นญ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ์ฝ๋๊ฐ ํจ์ฌ ๊ฐ๊ฒฐํด์ง ๊ฒ ๊ฐ๋ค.
Zustand ์ฌ์ฉํ ๋ ๋ฐ์ดํฐ๋ฅผ localStorage์ ์ ์ฅํ๋ ๋ฐฉ๋ฒ๋ ๋ฐฐ์ ๋ค. persist ๋ฏธ๋ค์จ์ด๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ก๊ณ ์นจํด๋ ์ํ๊ฐ ์ ์ง๋๋ค:
const useAuthStore = create(
persist(
(set) => ({
user: null,
login: (user) => set({ user }),
logout: () => set({ user: null })
}),
{ name: 'auth-storage' }
)
);
์ฌ๋ฐ๋ ๊ฑด partialize๋ผ๋ ๊ธฐ๋ฅ๋ ์๋ค๋ ๊ฒ. ๋ชจ๋ ์ํ๋ฅผ ์ ์ฅํ์ง ์๊ณ ํน์ ๋ถ๋ถ๋ง ์ ์ฅํ ์ ์๋ค:
{
name: 'user-storage',
partialize: (state) => ({ user: state.user }) // user๋ง ์ ์ฅ, ๋ค๋ฅธ ์ํ๋ ์ ์ฅ ์ ํจ
}
์ด ๊ธฐ๋ฅ์ ์ฅ๋ฐ๊ตฌ๋์ฒ๋ผ ์๋ก๊ณ ์นจํด๋ ์ ์ง๋์ด์ผ ํ๋ ๊ฒ๊ณผ ์์ UI ์ํ์ฒ๋ผ ์ ์งํ ํ์ ์๋ ๊ฒ์ ๊ตฌ๋ถํ ๋ ์ ์ฉํ ๊ฒ ๊ฐ๋ค.
์ฟ ํค ๊ด๋ฆฌ๋ฅผ ์ํ react-cookie ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์๊ฒ ๋๋ค. ์๊ฐ๋ณด๋ค ์ฐ๊ธฐ ์ฌ์ ๋ค:
const [cookies, setCookie, removeCookie] = useCookies(['token']);
// ์ฟ ํค ์ค์
setCookie('token', 'my-token', { path: '/', maxAge: 3600 });
// ์ฟ ํค ์ฝ๊ธฐ
console.log(cookies.token);
// ์ฟ ํค ์ญ์
removeCookie('token');
์ด์ ์๋ document.cookie๋ฅผ ์ง์ ๋ค๋ฃจ๊ฑฐ๋ ๋ณ๋์ ์ ํธ ํจ์๋ฅผ ๋ง๋ค์ด ์ผ๋๋ฐ, ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฐ๋ฉด ํจ์ฌ ๊ฐ๋จํด์ง ๊ฒ ๊ฐ๋ค.
์ด๋ฒ ์ฃผ์ ๋ฐฐ์ด ๊ฒ๋ค์ ์ถํ ์ ์ฉํ๋ฉด ์ฝ๋๊ฐ ๋ ๊น๋ํด์ง๊ณ ์ฌ์ฉ์ ๊ฒฝํ๋ ์ข์์ง ๊ฒ ๊ฐ๋ค. ํนํ createBrowserRouter์ loader ์กฐํฉ์ ๋ฐ์ดํฐ ํ์นญ ํจํด์ ์์ ํ ๋ฐ๊ฟ ์ ์์ ๊ฒ ๊ฐ๋ค.