์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ผ์ฐํ ์ด๋?
๋ผ์ฐํ : ์ฌ์ฉ์๊ฐ ์์ฒญํ URL์ ๋ฐ๋ผ ์๋ง์ ํ์ด์ง๋ฅผ ๋ณด์ฌ์ฃผ๋ ๊ฒ
์ฌ๋ฌ ํ์ด์ง๋ก ๊ตฌ์ฑ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ๋, ํ์ด์ง ๋ณ๋ก ์ปดํฌ๋ํธ๋ค์ ๋ถ๋ฆฌํด๊ฐ๋ฉด์ ํ๋ก์ ํธ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด ํ์ํ ๊ฒ์ด ๋ฐ๋ก ๋ผ์ฐํ ์์คํ ์ ๋๋ค.
๋ฆฌ์กํธ ๋ผ์ฐํฐ, Next.js ๋ฆฌ์ํธ์์ ๋ผ์ฐํ ์์คํ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
- ๋ฆฌ์กํธ ๋ผ์ฐํฐ : ์ปดํฌ๋ํธ ๊ธฐ๋ฐ์ผ๋ก ๋ผ์ฐํ ์์คํ ์ ์ค์ ํ ์ ์์ต๋๋ค.
- Next.js : ๋ฆฌ์กํธ ํ๋ก์ ํธ์ ํ๋ ์์ํฌ, ์ด ํ๋ ์์ํฌ์ ๋ผ์ฐํ ์์คํ ์ ํ์ผ ๊ฒฝ๋ก ๊ธฐ๋ฐ์ผ๋ก ์๋
๋ผ์ฐํ ๊ด๋ จ ๊ธฐ๋ฅ์ ๋ฆฌ์กํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๊ณต์์ ์ผ๋ก ์ง์ํ๋ ๊ฒ์ด ์๋ ์๋ ํํฐ๋ก ์ ๊ณต๋ฉ๋๋ค.
* ์๋ ํํฐ๋?
ํธํ๊ณ ํจ์จ์ ์ธ ๊ฐ๋ฐ์ ์ํด, ํ๋ฌ๊ทธ์ธ์ด๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋๋ ํ๋ ์์ํฌ๋ก, ์ ์์ฌ์์ ๋ง๋ ๊ฒ์ด ์๋๋ผ ๋ค๋ฅธ ์ ์ฒด์์ ๋ง๋ ํด๋น ํด ์ง์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ.
์ฑ๊ธ ํ์ด์ง ์ ํ๋ฆฌ์ผ์ด์
: ํ๋์ ํ์ด์ง๋ก ์ด๋ฃจ์ด์ง ์ ํ๋ฆฌ์ผ์ด์
์ด๋ ๊ฒ html์ ํ ๋ฒ ๋ง ๋ฐ์์์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํ์ํจ ํ, ํ์ํ ๋ฐ์ดํฐ๋ง ๋ฐ์์ ํ๋ฉด์ ์ ๋ฐ์ดํธํ๋๊ฒ
↔ ๋ฉํฐ ํ์ด์ง ์ ํ๋ฆฌ์ผ์ด์ : ์ฌ์ฉ์๊ฐ ๋ค๋ฅธ ํ์ด์ง๋ก ์ด๋ํ ๋๋ง๋ค ์๋ก์ด html์ ๋ฐ์์ค๊ณ , ํ์ด์ง๋ฅผ ๋ก๋ฉํ ๋๋ง๋ค ์๋ฒ์์ css, js, ์ด๋ฏธ์ง ํ์ผ ๋ฑ์ ๋ฆฌ์์ค๋ฅผ ์ ๋ฌ๋ฐ์ ๋ธ๋ผ์ฐ์ ์ ๋ณด์ฌ์ค.
๊ฐ ํ์ด์ง๋ง๋ค ๋ค๋ฅธ html ํ์ผ์ ๋ง๋ค์ด์ ์ ๊ณตํ๊ฑฐ๋ ๋ฐ์ดํฐ์ ๋ฐ๋ผ ์ ๋์ ์ธ html์ ์์ฑํด์ฃผ๋ ํ ํ๋ฆฟ ์์ง์ ์ฌ์ฉ
์ฌ์ฉ์ ์ธํฐ๋์ ์ด ๋ง๊ณ ๋ค์ํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ๋ชจ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ, ์๋ก์ด ํ์ด์ง๋ฅผ ๋ณด์ฌ์ค์ผ ํ ๋๋ง๋ค ์๋ฒ์ธก์์ ๋ถ๋ด์ ์ค.
-> ๊ทธ๋์ ๋ฆฌ์กํธ๋ฅผ ์ฌ์ฉํด ๋ทฐ ๋ ๋๋ง์ ์ฌ์ฉ์์ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ด๋นํ๋๋ก ํ๊ณ , ์ธํฐ๋์ ์ด ๋ฐ์ํ๋ฉด ํ์ํ ๋ถ๋ถ๋ง ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ฐ์ดํธํ๋ ๋ฐฉ์์ ์ฌ์ฉํ๊ฒ ๋์ต๋๋ค. (ํ์ํ ๋ฐ์ดํฐ๋ง ์๋ก ๋ถ๋ฌ์ ์ฌ์ฉ)
๋ค๋ฅธ ํ์ด์ง๋ก ์ด๋ํ ๋ ์๋ฒ์ ๋ค๋ฅธ ํ์ด์ง์ html์ ์๋ก ์์ฒญํ๋ ๊ฒ์ด ์๋,
๋ธ๋ผ์ฐ์ ์ History API๋ฅผ ์ฌ์ฉํด ๋ธ๋ผ์ฐ์ ์ ์ฃผ์์ฐฝ์ ๊ฐ๋ง ๋ณ๊ฒฝํ๊ณ
๊ธฐ์กด์ ํ์ด์ง์ ๋์ ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ทธ๋๋ก ์ ์งํ๋ฉด์ ๋ผ์ฐํ ์ค์ ์ ๋ฐ๋ผ ๋ ๋ค๋ฅธ ํ์ด์ง๋ฅผ ๋ณด์ฌ์ฃผ๊ฒ ๋ฉ๋๋ค.
<BrowserRouter>
ํ๋ก์ ํธ์ ๋ฆฌ์กํธ ๋ผ์ฐํฐ๋ฅผ ์ ์ฉํ ๋ BrowserRouter๋ผ๋ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํด ๊ฐ์ธ๋ฉด ๋ฉ๋๋ค.
์ด ์ปดํฌ๋ํธ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ HTML5์ Histroy API๋ฅผ ์ฌ์ฉํ์ฌ ํ์ด์ง๋ฅผ ์๋ก ๋ถ๋ฌ์ค์ง ์๊ณ ๋ ์ฃผ์๋ฅผ ๋ณ๊ฒฝํ๊ณ ํ์ฌ ์ฃผ์์ ๊ฒฝ๋ก์ ๊ด๋ จ๋ ์ ๋ณด๋ฅผ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ ์ ์๋๋ก ํด์ค๋๋ค.
<Route> ์ปดํฌ๋ํธ
: ํน์ ๊ฒฝ๋ก(์ฃผ์)์ ์ํ๋ ์ปดํฌ๋ํธ ๋ณด์ฌ์ฃผ๊ธฐ
<Route path="์ฃผ์ ๊ท์น" elemet={๋ณด์ฌ ์ค ์ปดํฌ๋ํธ JSX}/>
<Route path="/about" element={<About />} />
<Link> ์ปดํฌ๋ํธ
: ๋ค๋ฅธ ํ์ด์ง๋ก ์ด๋ํ๋ ๋งํฌ ๋ณด์ฌ์ฃผ๊ธฐ
๋ฆฌ์กํธ ๋ผ์ฐํฐ๋ฅผ ์ฌ์ฉํ๋ ํ๋ก์ ํธ์์๋ <a> ํ๊ทธ๋ฅผ ๋ฐ๋ก ์ฌ์ฉํ๋ฉด ์๋๋ค.
์๋ํ๋ฉด <a> ํ๊ทธ๋ก ํ์ด์ง๋ฅผ ์ด๋์, ๋ธ๋ผ์ฐ์ ์์๋ ํ์ด์ง๋ฅผ ์๋ก ๋ถ๋ฌ์ค๊ธฐ ๋๋ฌธ์ด๋ค.
Link ์ปดํฌ๋ํธ๋ <a>ํ๊ทธ๋ฅผ ์ฌ์ฉํ๊ธด ํ์ง๋ง,
ํ์ด์ง๋ฅผ ์๋ก ๋ถ๋ฌ์ค๋ ๊ฒ์ ๋ง๊ณ , Histroy API๋ฅผ ํตํด ๋ธ๋ผ์ฐ์ ์ฃผ์์ ๊ฒฝ๋ก๋ง ๋ฐ๋๋ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์๋ค.
<Link to="๊ฒฝ๋ก"> ๋งํฌ ์ด๋ฆ</Link>
<Link to="/about"> ์๊ฐ </Link>
URL ํ๋ผ๋ฏธํฐ์ ์ฟผ๋ฆฌ์คํธ๋ง
ํ์ด์ง ์ฃผ์๋ฅผ ์ ์ํ ๋ ๊ฐ๋์ ์ ๋์ ์ธ ๊ฐ์ ์ฌ์ฉํฉ๋๋ค.
- URL ํ๋ผ๋ฏธํฐ
: ์ฃผ์์ ๊ฒฝ๋ก์ ์ ๋์ ์ธ ๊ฐ์ ๋ฃ๋ ํํ, ์ฃผ๋ก ID๋๋ ์ด๋ฆ์ ์ฌ์ฉํ์ฌ ํน์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ๋ ์ฌ์ฉ
- ์ฟผ๋ฆฌ์คํธ๋ง
: ์ฃผ์์ ๋ท๋ถ๋ถ์ ' ? '๋ฌธ์์ด ์ดํ์ key=value๋ก ๊ฐ์ ์ ์ํ๋ฉฐ &๋ก ๊ตฌ๋ถํ๋ ํํ, ํค์๋ ๊ฒ์, ํ์ด์ง๋ค์ด์ , ์ ๋ ฌ ๋ฐฉ์ ๋ฑ ๋ฐ์ดํฐ ์กฐํ์ ํ์ํ ์ต์ ์ ์ ๋ฌํ ๋ ์ฌ์ฉ
- URL ํ๋ผ๋ฏธํฐ
useParams : ์ด Hook์ ์ฌ์ฉํด ๊ฐ์ฒด ํํ๋ก ์กฐํํ ์ ์์ต๋๋ค.
Profile.js
import { useParams } from "react-router-dom"; const data = {
velopert: {
name: "๊น๋ฏผ์ค",
description: "๋ฆฌ์กํธ๋ฅผ ์ข์ํ๋ ๊ฐ๋ฐ์",
},
gildong: {
name: "ํ๊ธธ๋",
description: "๊ณ ์ ์์ค ์ฃผ์ธ๊ณต",
},
};
const Profile = () => {
/* URL ํ๋ผ๋ฏธํฐ๋ useParams๋ผ๋ Hook์ ์ฌ์ฉํด ๊ฐ์ฒด ํํ๋ก ์กฐํ ๊ฐ๋ฅ */
const params = useParams();
/*username URL ํ๋ผ๋ฏธํฐ๋ฅผ ํตํ์ฌ ํ๋กํ์ ์กฐํ*/
const profile = data[params.username];
console.log("profile", profile); /* 'veloper' or 'gildong' */
return (
<div>
<h1>์ฌ์ฉ์ ํ๋กํ</h1>
{profile ? (
<div>
<h2>{profile.name}</h2>
<p>{profile.description}</p>
</div>
) : (
<p>์กด์ฌํ์ง ์๋ ํ๋กํ์
๋๋ค.</p>
)}
</div>
);
};
export default Profile;
|
App.js
import { Route, Routes } from "react-router-dom"; import "./App.css";
import Home from "./pages/Home";
import Profile from "./pages/Profile";
function App() {
return (
<Routes>
<Route index element={<Home />} />
{/* URL ํ๋ผ๋ฏธํฐ์ ์ด๋ฆ์ ๋ผ์ฐํฐ๋ฅผ ์ค์ ํ ๋ Route ์ปดํฌ๋ํธ์ path props๋ฅผ ํตํด ์ค์ */}
<Route path="/profiles/:username" element={<Profile />} />
</Routes>
);
}
export default App;
|
Home.js
import { Link } from "react-router-dom"; const Home = () => {
return (
<div>
<ul>
<li>
<Link to="/about">์๊ฐ</Link>
</li>
<li>
<Link to="/profiles/velopert">velopert์ ํ๋กํ</Link>
</li>
<li>
<Link to="/profiles/gildong">gildong์ ํ๋กํ</Link>
</li>
<li>
<Link to="/profiles/void">์กด์ฌํ์ง ์๋ ํ๋กํ</Link>
</li>
<li>
<Link to="/articles">๊ฒ์๊ธ ๋ชฉ๋ก</Link>
</li>
</ul>
</div>
);
};
export default Home;
|
- ์ฟผ๋ฆฌ์คํธ๋ง
useSearchParams๋ผ๋ ์ด Hook์ ํตํด, ๋ฌธ์์ด์ ๋ถ๋ฆฌํ ๋ค key์ value๋ก ํ์ฑํ ์ ์์ต๋๋ค.
useSearchParams๋ ๋ฐฐ์ด ํ์ ์ ๊ฐ์ ๋ฐํ,
์ฒซ ๋ฒ์งธ ์์(searchParams)๋ ์ฟผ๋ฆฌํ๋ผ๋ฏธํฐ๋ฅผ ์กฐํ(get)*์์ (set)ํ๋ ๋ฉ์๋๋ค์ด ๋ด๊ธด ๊ฐ์ฒด ๋ฐํ
๋ง์ฝ ์กฐํ ์ ์ฟผ๋ฆฌํ๋ผ๋ฏธํฐ๊ฐ ์กด์ฌํ์ง ์๋๋ค๋ฉด -> null๋ก ์กฐํ๋จ.
๋๋ฒ์งธ ์์(setSearchParams)๋ ์ฟผ๋ฆฌํ๋ผ๋ฏธํฐ๋ฅผ ๊ฐ์ฒด ํํ๋ก ์
๋ฐ์ดํธ ํ ์ ์๋ ํจ์๋ฅผ ๋ฐํ
About.js
import { useSearchParams } from "react-router-dom"; const About = () => {
const [searchParams, setSearchParams] = useSearchParams();
const detail = searchParams.get("detail");
const mode = searchParams.get("mode");
const onToggleDetail = () => {
setSearchParams({ mode, detail: detail === "true" ? false : true });
};
const onIncreaseMode = () => {
const nextMode = mode === null ? 1 : parseInt(mode) + 1;
setSearchParams({ mode: nextMode, detail });
};
return (
<div>
<h1>์๊ฐ</h1>
<p>๋ฆฌ์กํธ ๋ผ์ฐํฐ๋ฅผ ์ฌ์ฉํด ๋ณด๋ ํ๋ก์ ํธ์
๋๋ค.</p>
<p>detail: {detail}</p>
<p>mode: {mode}</p>
<button onClick={onToggleDetail}> toggle detail</button>
<button onClick={onIncreaseMode}> increase mode</button>
</div>
);
};
export default About;
|
์ค์ฒฉ๋ ๋ผ์ฐํธ
์ค์ฒฉ๋ ๋ผ์ฐํธ๋ฅผ ํตํด ๊ณตํต ๋ ์ด์์ ์ปดํฌ๋ํธ๋ก, ํ์ด์ง๋ผ๋ฆฌ ๊ณตํต์ ์ผ๋ก ๋ณด์ฌ์ค์ผ ํ๋ ๋ ์ด์์์ ํํํ ์๋ ์๋ค.
์ค์ฒฉ๋ ๋ผ์ฐํธ๋ ์ปดํฌ๋ํธ๋ฅผ ํ๋ฒ๋ง ์ฌ์ฉํด๋ ๋๋ค๋ ์ฅ์ ์ด ์๋ค.
<Outlet> ์ปดํฌ๋ํธ
: Route์ children์ผ๋ก ๋ค์ด๊ฐ๋ JSX ์๋ฆฌ๋จผํธ๋ฅผ ๋ณด์ฌ์ฃผ๋ ์ญํ
index props
์ด props๋ path="/"์ ๋์ผํ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ค.
Layout.js
import { Outlet } from "react-router-dom"; const Layout = () => {
return (
<div>
<header style={{ background: "lightgreen", padding: 16, fontSize: 24 }}>
<button onClick={goBack}>๋ค๋ก๊ฐ๊ธฐ</button>
<button onClick={goArticle}>๊ฒ์๊ธ๋ก ๊ฐ๊ธฐ</button>
</header>
<main>
<Outlet />
</main>
</div>
);
};
export default Layout;
|
App.js
import { Route, Routes } from "react-router-dom"; import "./App.css";
import About from "./pages/About";
import Article from "./pages/Article";
import Articles from "./pages/Articles";
import Home from "./pages/Home";
import Layout from "./pages/Layout";
import Profile from "./pages/Profile";
function App() {
return (
<Routes>
<Route element={<Layout />}>
<Route index element={<Home />} />
<Route path="/about" element={<About />} />
<Route path="/profiles/:username" element={<Profile />} />
<Route path="/articles" element={<Articles />}>
<Route path="/articles/:id" element={<Article />} />
</Route>
</Route>
</Routes>
);
}
export default App;
|
๋ฆฌ์ํธ ๋ผ์ฐํฐ ๋ถ๊ฐ๊ธฐ๋ฅ
1. useNavigate
: Link ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋ค๋ฅธ ํ์ด์ง๋ก ์ด๋ํ๋ ์ํฉ์ ์ฌ์ฉํ๋ Hook
+ replace props
: ์ด ์ต์ ์ ์ฌ์ฉํ๋ฉด ํ์ด์ง๋ฅผ ์ด๋ํ ๋ ํ์ฌ ํ์ด์ง๋ฅผ ํ์ด์ง ๊ธฐ๋ก์ ๋จ๊ธฐ์ง ์์ต๋๋ค.
→ ๋ค๋ก ๊ฐ๊ธฐ๋ฅผ ๋๋ ์๋ navigation(-2)
import { Outlet, useNavigate } from "react-router-dom";
const Layout = () => {
const navigation = useNavigate();
const goBack = () => {
// ๋ค๋ก๊ฐ๊ธฐ navigation(-1);
};
const goArticle = () => {
// articles ๊ฒฝ๋ก๋ก ์ด๋ navigation("/articles", { replace: true });
};
return (
<div>
<header style={{ background: "lightgreen", padding: 16, fontSize: 24 }}>
<button onClick={goBack}>๋ค๋ก๊ฐ๊ธฐ</button>
<button onClick={goArticle}>๊ฒ์๊ธ๋ก ๊ฐ๊ธฐ</button>
</header>
<main>
<Outlet />
</main>
</div>
);
};
export default Layout;
|
2. <NavLink> ์ปดํฌ๋ํธ
: ๋งํฌ์์ ์ฌ์ฉํ๋ ๊ฒฝ๋ก๊ฐ ํ์ฌ ๋ผ์ฐํธ์ ๊ฒฝ๋ก์ ์ผ์นํ๋ ๊ฒฝ์ฐ ํน์ ์คํ์ผ or CSS ํด๋์ค(className)๋ฅผ ์ ์ฉํ๋ค.
์ด ์ปดํฌ๋ํธ์ style๊ณผ className๋ { isActive? boolean } ์ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ๋ฐ๋ ํจ์ ํ์ ์ ๊ฐ์ ์ ๋ฌํ๋ค.
Articles .js
import { Outlet, NavLink } from "react-router-dom"; const Articles = () => {
const activeStyle = {
color: "green",
fontSize: "24px",
};
return (
<div>
<Outlet />
<ul>
<li>
<NavLink
to="/articles/1"
style={({ isActive }) => (isActive ? activeStyle : undefined)}
>
๊ฒ์๊ธ1
</NavLink>
</li>
<li>
<NavLink
to="/articles/2"
style={({ isActive }) => (isActive ? activeStyle : undefined)}
>
๊ฒ์๊ธ2
</NavLink>
</li>
<li>
<NavLink
to="/articles/3"
style={({ isActive }) => (isActive ? activeStyle : undefined)}
>
๊ฒ์๊ธ3
</NavLink>
</li>
</ul>
</div>
);
};
export default Articles;
|
3. NotFound ํ์ด์ง ๋ง๋ค๊ธฐ
: ์ด ํ์ด์ง๋ ์ฌ์ ์ ์ ์๋์ง ์๋ ๊ฒฝ๋ก์ ์ฌ์ฉ์๊ฐ ์ง์ ํ์ ๋ ๋ณด์ฌ์ฃผ๋ ํ์ด์ง
NotFound.js const NotFound = () => {
return (
<div
style={{
display: "flex",
alignItems: "center",
justifycontents: "center",
fontSize: 64,
position: "absolute",
width: "100%",
height: "100%",
}}
>
404 error
</div>
);
};
export default NotFound;
|
App.js
import { Route, Routes } from "react-router-dom"; import "./App.css";
import Home from "./pages/Home";
import Layout from "./pages/Layout";
import NotFound from "./pages/NotFound";
function App() {
return (
<Routes>
<Route element={<Layout />}>
<Route index element={<Home />} />
<Route path="*" element={<NotFound />} />
</Routes>
);
}
export default App;
|
*๋ wildcard ๋ฌธ์๋ก, ์๋ฌด ํ ์คํธ๋ ๋งค์นญํ๋ค๋ ๋ป
์ด ๋ผ์ฐํธ ์๋ฆฌ๋จผํธ ์๋จ์ ์์นํ๋ ๋ผ์ฐํธ๋ค์ ๊ท์น์ ๋ชจ๋ ํ์ธํ๊ณ , ์ผ์นํ๋ ๋ผ์ฐํธ๊ฐ ์๋ค๋ฉด ์ด ๋ผ์ฐํธ๊ฐ ํ๋ฉด์ ๋ํ๋จ.
4. <Navigate> ์ปดํฌ๋ํธ
: ์ปดํฌ๋ํธ๋ฅผ ํ๋ฉด์ ๋ณด์ฌ์ฃผ๋ ์๊ฐ ๋ค๋ฅธ ํ์ด์ง๋ก ์ด๋. (์ฆ, ํ์ด์ง๋ฅผ ๋ฆฌ๋ค์ด๋ ํธํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ค.)
EX ) ๋ก๊ทธ์ธ์ด ํ์ํ ํ์ด์ง์ธ๋ฐ ๋ก๊ทธ์ธ์ ์ ํ๋ค๋ฉด, ๋ก๊ทธ์ธ ํ์ด์ง๋ก ์ด๋ํ๊ธฐ
Login.js
const Login = () => { return <div>๋ก๊ทธ์ธ ํ์ด์ง</div>;
};
export default Login;
|
App.js
import { Route, Routes } from "react-router-dom"; import "./App.css";
import Home from "./pages/Home";
import Layout from "./pages/Layout";
import Login from "./pages/Login";
import MyPage from "./pages/MyPage";
function App() {
return (
<Routes>
<Route element={<Layout />}>
<Route index element={<Home />} />
<Route path="/login" element={<Login />} />
<Route path="/mypage" element={<MyPage />} />
</Routes>
);
}
export default App;
|
MyPage.js
import { Navigate } from "react-router-dom"; const MyPage = () => {
const isLogin = false;
if (!isLogin) {
return <Navigate to="/login" replace={true} />;
}
return <div> ๋ง์ดํ์ด์ง</div>;
};
export default MyPage;
|
๋ฆฌ์ํธ ๋ผ์ฐํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ฃผ์ ๊ฒฝ๋ก์ ๋ฐ๋ผ ๋ค์ํ ํ์ด์ง๋ฅผ ๋ณด์ฌ ์ฃผ๋ ๋ฐฉ๋ฒ์ ํ์ตํ์ต๋๋ค.
์น ๋ธ๋ผ์ฐ์ ์์ ์ฌ์ฉํ ์ปดํฌ๋ํธ, ์ํ ๊ด๋ฆฌ๋ฅผ ํ๋ ๋ก์ง, ๊ทธ ์ธ ์ฌ๋ฌ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ํจ์๋ค์ด ์ ์ ์์ด๋ฉด์ ์ต์ข ๊ฒฐ๊ณผ๋ฌผ์ธ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ํฌ๊ธฐ๊ฐ ๋งค์ฐ ์ปค์ง๋๋ค.
์ฝ๋ ์คํ๋ฆฌํ (์ดํ์ ๋ฐฐ์ธ ๋ด์ฉ)
: ๋ผ์ฐํธ์ ๋ฐ๋ผ ํ์ํ ์ปดํฌ๋ํธ๋ง ๋ถ๋ฌ์ค๊ณ , ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ ๋ค๋ฅธ ํ์ด์ง๋ก ์ด๋ํ๋ ๋ฑ ํ์ํ ์์ ์ ๋ถ๋ฌ์ค๋ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ
'javascript > [TIL] ๋ฆฌ์กํธ๋ฅผ ๋ค๋ฃจ๋ ๊ธฐ์ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฆฌ์กํธ๋ฅผ ๋ค๋ฃจ๋ ๊ธฐ์ - Context API (0) | 2022.10.27 |
---|---|
[๊ตฌ๊ธ๋ง] ๋ฆฌ์กํธ๋ฅผ ๋ค๋ฃจ๋ ๊ธฐ์ - ์ธ๋ถ API๋ฅผ ์ฐ๋ํ์ฌ ๋ด์ค ๋ทฐ์ด ๋ง๋ค๊ธฐ (0) | 2022.10.27 |
๋ฆฌ์กํธ๋ฅผ ๋ค๋ฃจ๋ ๊ธฐ์ - ์ปดํฌ๋ํธ ์ฑ๋ฅ ์ต์ ํ (0) | 2022.10.19 |
10/11์ผ ์ค๋ ๊ตฌ๊ธ๋ง ํ ๋ด์ฉ (Prettier Option, CSS) (0) | 2022.10.11 |
๋ฆฌ์กํธ๋ฅผ ๋ค๋ฃจ๋ ๊ธฐ์ - Hooks (0) | 2022.10.11 |