[project] ๐ŸŽฌMovyes: ์˜ํ™” ์ปค๋ฎค๋‹ˆํ‹ฐ React ํ”„๋กœ์ ํŠธ - ๋„๋ฉ”์ธ ์ด๋™ ๋ง‰๊ธฐ!

์˜ค์˜ค๊ตฌยท2023๋…„ 1์›” 11์ผ
0

๋„๋ฉ”์ธ ์ด๋™ ๋ง‰๊ธฐ

๋“œ๋””์–ด, ๊ธฐ๋Šฅ ๊ตฌํ˜„์˜ ๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„!
๋กœ๊ทธ์ธ์„ ํ•˜์ง€ ์•Š์œผ๋ฉด ์–ด๋–ค ๋„๋ฉ”์ธ์— ์ ‘๊ทผํ•ด๋„ ๋ฐ˜๋“œ์‹œ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๊ฐ€ ๋‚˜ํƒ€๋‚˜๊ฒŒ ๋งŒ๋“ ๋‹ค.


์ƒ์„ธ ๊ธฐ๋Šฅ

  • ๋กœ๊ทธ์ธ ํ•˜์ง€ ์•Š์€ ์‚ฌ์šฉ์ž๋Š” ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€์—๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ

๊ณ ๋ฏผ

๋กœ๊ทธ์ธ ์—ฌ๋ถ€๋ฅผ ๊ฒ€์‚ฌํ•˜๋Š” ProtectedRoute ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค๊ณ , ๋„๋ฉ”์ธ ์ด๋™์„ ๋ง‰์•„์•ผ ํ•˜๋Š” ํŽ˜์ด์ง€๋“ค์—๊ฒŒ ์ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ์”Œ์šฐ๋Š” ๋ฐฉ์‹œ๊ธ๋กœ ๊ฐ„๋‹จํžˆ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์„๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ ์ƒ๊ฐ์™ธ๋กœ ์‰ฝ๊ฒŒ ํ’€๋ฆฌ์ง€ ์•Š์•˜๋‹ค.

๋ ์šฉ? user์ •๋ณด๊ฐ€ ์žˆ๋Š”๋ฐ ์—†์Šต๋‹ˆ๋‹ค

๋ฉ”๋‰ด ๋งํฌ๋ฅผ ํ†ตํ•ด์„œ ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ•  ๋• ์•„๋ฌด ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ๋Š”๋ฐ, ์ฃผ์†Œ์ฐฝ์— url์„ ์ง์ ‘ ์ž…๋ ฅํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ๋‹ค.

url์„ ์ง์ ‘ ์ž…๋ ฅํ•˜๋ฉด ๋ถ„๋ช… ๋กœ๊ทธ์ธ์„ ํ•œ ์ƒํƒœ์ธ๋ฐ๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ๋Œ์•„๊ฐ€๋Š” ๊ฒƒ์ด๋‹ค.

์™œ์ด๋Ÿฐ๊ฐ€ ์‹ถ์–ด์„œ ์ฝ˜์†”๋กœ user๊ฐ’์„ ์ถœ๋ ฅํ•ด๋ณด์•˜๋”๋‹ˆ url์„ ํ†ตํ•ด ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ•  ๋•Œ ์ฒ˜์Œ์—” user์ •๋ณด๊ฐ€ undefined๋กœ ๋œจ๊ณ  ๊ทธ ํ›„ ์ •๋ณด๊ฐ€ ๋ฐ˜์˜๋˜์—ˆ๋‹ค. url๋กœ ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ•˜๋ฉด ์ƒˆ๋กœ๊ณ ์นจ์ด ๋˜๋ฉด์„œ user์ •๋ณด๋ฅผ ์ฆ‰๊ฐ์ ์œผ๋กœ ๋ฐ›์•„์˜ค์ง€ ๋ชปํ•˜๊ณ  ๋”œ๋ ˆ์ด๊ฐ€ ์ƒ๊ธฐ๊ธฐ ๋•Œ๋ฌธ์ธ ๊ฒƒ ๊ฐ™์•˜๋‹ค.

์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋ฉด ์ข‹์„์ง€ ๊ณ ๋ฏผ์„ํ•˜๋‹ค๊ฐ€ ๋กœ๊ทธ์ธ์„ ์•ˆํ•ด์„œ user์ •๋ณด๊ฐ€ ์—†์„ ๊ฒฝ์šฐ์—๋Š” null๋กœ ๋œฌ๋‹ค๋Š”๊ฑธ ์•Œ์•˜๊ณ , if๋ฌธ์„ ํ†ตํ•ด user===null ์ผ๋•Œ๋งŒ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ์ด๋™๋˜๋„๋ก ์ฒ˜๋ฆฌํ•ด์ฃผ์—ˆ๋‹ค.

์ง€๊ธˆ์€ ์ด๋ ‡๊ฒŒ ๋‘์—ˆ์ง€๋งŒ ์ดํ›„ react-query ๋“ฑ์„ ์ด์šฉํ•œ ์บ์‹ฑ ์ž‘์—…์œผ๋กœ if๋ฌธ์„ ์•ˆ์จ๋„ ๋˜๋„๋ก ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ ์‹ถ๋‹ค.


๊ตฌํ˜„

index

const router = createBrowserRouter([
  {
    path: "/",
    element: <App />,
    errorElement: <NotFound />,
    children: [
      {
        index: true,
        element: (
    	// ProtectedRoute์ปดํฌ๋„ŒํŠธ๋ฅผ ์”Œ์›Œ์ค€๋‹ค
          <ProtectedRoute>
            <Home />
          </ProtectedRoute>
        ),
      },
      {
        path: "search",
        element: (
          <ProtectedRoute>
            <Search />
          </ProtectedRoute>
        ),
      },
      {
        path: "community",
        element: (
          <ProtectedRoute>
            <Community />
          </ProtectedRoute>
        ),
      },
      {
        path: "my_pick",
        element: (
          <ProtectedRoute>
            <Pick />
          </ProtectedRoute>
        ),
      },
      { path: "sign_in", element: <SignIn /> },
      { path: "sign_up", element: <SignUp /> },
    ],
  },
]);

const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
  <AuthProvider>
    <Provider store={store}>
      <RouterProvider router={router}>
        <App />
      </RouterProvider>
    </Provider>
  </AuthProvider>
);

ProtectedRoute

import { useEffect } from "react";
import { useNavigate } from "react-router-dom";
import { useAuthContext } from "../store/auth/AuthContext";

export default function ProtectedRoute({ children }) {
  const { user } = useAuthContext();
  const navigate = useNavigate();
  
  useEffect(() => {
    if (user === null) {
      navigate("/sign_in");
    }
  }, [user]);
  return children;
}

+) ๋กœ๊ทธ์ธํ–ˆ์„ ๋•Œ / ๊ฒฝ๋กœ๋กœ ์ด๋™๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ๋‹ค. ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ์€ ์œ ์ €๊ฐ€ ์ฒ˜์Œ ๋งŒ๋‚˜๊ฒŒ ๋˜๋Š” ๊ธฐ๋Šฅ์ด๋ฏ€๋กœ ๊ฐ€์žฅ ๋จผ์ € ์ˆ˜์ •ํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค.

profile
๋” ์ด์ƒ ๋ฏธ๋ฃฐ ์ˆ˜ ์—†๋‹ค

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