Info: ๐จ ๋ชฉ์ฐจ
https://qwerewqwerew.github.io/retype-react/๋ ์ํผ์ฑ/8/#1-์์ํ์ผ
https://qwerewqwerew.github.io/retype-react/๋ ์ํผ์ฑ/8/#1-์์ํ์ผ
1. Router ์ดํด (Part1)
1.1. ์์ํ์ผ
Info: ๐ก ๋ง์ฝ ์ด์ ํ์ผ์ด ์์ ๊ฒฝ์ฐ ์๋์ ํ์ผ์ ๋ค์ด๋ก๋ ํ์ฌ ์งํํ๋ค
ํ์ผ๋ค์ด๋ก๋
1. ๋ค์ด๋ก๋ ๋ฐ์ start.zip ํ์ผ์ ์์ถ์ ํผ๋ค
1. ์ ๋ฆฌ์กํธ ์ฑ์ ์ค์นํ๋ค. ๋ฆฌ์กํธ ์ฑ ์ค์น๋ฅผ ๋ชจ๋ฅผ๊ฒฝ์ฐ ์๋ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ๋ค.
๐[๋ฆฌ์กํธ ์ค์น์๋ด](https://www.notion.so/b2b65b3a6a9743ef84174efb17630e12)
1. ๋ฆฌ์กํธ ์ฑ์ ์ค์น๊ฐ ์ผ๋ฃ ๋์์ผ๋ฉด 1๋ฒ์ ํ์ผ์์ถ์ ํผ๋ค
1. ์์ถ์ ํ๊ฒ ๋๋ฉด start/src ํด๋๊ฐ ์๋ค.
1. 2๋ฒ์ srcํด๋์ 4๋ฒ์ src ํด๋๋ฅผ ๋ฎ์ด ์์ด๋ค.

- 2๋ฒ์ ํด๋๋ฅผ ๋ฃจํธ๋ก ์ ํํ์ฌ vscode๋ฅผ ์ฐ๋ค.
- vscode ์ ํฐ๋ฏธ๋์ npm start ๋ฅผ ์ ๋ ฅํ์ฌ ์ฑ์ ์คํํ๋ค.
1.2. ์ฐ๊ด๋งํฌ
| ์ข ๋ฅ | ๐๋งํฌ |
|---|---|
| ๋ฆฌ์กํธ๋ผ์ฐํฐ ๊ณต์๋ฌธ์ | ReactRouter |
1.3. ๋ผ์ฐํฐ์ ๊ธฐ์ด๊ฐ๋
1.3.1. ๋ผ์ฐํฐ๋
๋ฐ์ดํฐ๋ฅผ ์ฐ๊ฒฐํ๋ ์ฅ์น
1.3.2 ๋ผ์ฐํ ์ด๋
๋ฐ์ดํฐ์ ์ต๋จ/์ต์ ๊ฒฝ๋ก ์ฐพ๊ธฐ

1.3.3. MPA๋
๋ ๊ฑฐ์(Classic) ์นํ์ด์ง์ ๋งํฌ(๋ผ์ฐํ
)๋ฐฉ์.
์ฌ๋ฌ๊ฐ ํ์ด์ง๋ฅผ ์ ์ํ์ฌ ์ฐ๊ฒฐํ๋ ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ํ์ด์ง ์ ์ฒด๊ฐ ์
๋ฐ์ดํธ ๋๋ค.
1.3.4. SPA๋
ํ๊ฐ์ ํ์ด์ง์์ ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ ์ปดํฌ๋ํธ๋ง ์
๋ฐ์ดํธ ๋๋ ๋ฐฉ์์ผ๋ก index ํ์ด์ง ํ๋์ ์ปดํฌ๋ํธ๋ฅผ ๊ต์ฒดํ๋ ๋ฐฉ์์ผ๋ก ์ ์ํ๋ค.
๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ๋ง ์
๋ฐ์ดํธ ๋๋ค.

2. ๋ผ์ฐํฐ ์ฐ์ต
Info: ๐ก ๋ฆฌ์กํธ์ค์บํด๋ฉ
https://github.com/qwerewqwerew/react-scaffolding
2.1. react-router ์ค์น
react-router ๋ ๋ฆฌ์กํธ ๊ฐ๋ฐํ๊ฒฝ์์ ๋ฆฌ์กํธ์ ์ปดํฌ๋ํธ๋ฅผ ์ฐ๊ฒฐํ๋ ๋ชจ๋์ด๋ค.
v3 ๊น์ง๋ ํ๋์ ๋ชจ๋ ์ด์์ผ๋ v4๋ถํฐ ๋ค์ดํฐ๋ธ ์ฑ ์ฉย react-router-native์ ์น ๊ฐ๋ฐ์ฉย react-router-domย ์ผ๋ก ๋ถ๋ฆฌ๋์๋ค.
React-router-dom v5 VS v6
React-rounter-dom v5 ์ v6์ ๋ช
๋ น์ด๊ฐ ํฌ๊ฒ ๋ณ๊ฒฝ ๋์์ผ๋ฏ๋ก ํ๋ก์ ํธ ์ ์ง๋ณด์ ์ ์ฌ์ฉ๋ ๋ฒ์ ์ ํ์ธ ํ ๊ทธ์ ๋ง๋ ๋ฌธ๋ฒ์ ์ฌ์ฉํด์ผ ํ๋ค.
๋ํ v6๋ v6.4์ดํ ์ถ๊ฐ๋ ๋ฌธ๋ฒ์ด ์๋ค.
์์ ์์๋ v6.4์ดํ๋ฅผ ์ค์ ์ ์ผ๋ก ๋ค๋ฃฌ๋ค.
- ๋ชจ๋์ค์น
- ์ด๋ ค์๋ ๊ฐ๋ฐ์๋ฒ๋ฅผ ๋ซ๊ณ vscode ํฐ๋ฏธ๋ ์ฐฝ์ ์๋์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ ์ค์นํ๋ค.
npm i react-router
- ์ค์น๊ฐ ์๋ฃ๋๋ฉด ์๋ฒ๋ฅผ ์คํํ๋ค.
npm run dev
2.2. ์ปดํฌ๋ํธ ์์ฑ
์ฐ์ตํ ์ปดํฌ๋ํธ ํ๊ฒฝ์ ๊ตฌ์ฑํ๋ค.
- ์๋ ๊ตฌ์กฐ๋๋ก ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ๋ค
/srcโโฌโ
โโโ/pages โโฌ
โโโHome.jsx
โโโProducts.jsx
- Home ๊ณผ Projects ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ๋ค.
import React from "react";
const Home = () => {
return <h1>Home</h1>;
};
export default Home;
import React from "react";
const Products = () => {
return <h1>Products</h1>;
};
export default Products;
jsx ํ์ฅ์๋ ๋ญ๊ฐ์?
๋ฆฌ์กํธ ํ๋ก์ ํธ ์ฝ๋๋ฅผ ๋ถ์ํ๋ค ๋ณด๋ฉด jsx ๋ผ๋ ํ์ฅ์๋ฅผ ๋ณผ์ ์๋๋ฐ js์ jsx๋ ๊ฐ๋ค.
์ฌ์ฉ์ด์ ๋ ๊ฐ๋ฐ์๊ฐ ์ปดํฌ๋ํธ ํ์ผ์ ๊ตฌ๋ณ์ ์ฝ๊ฒ ํ๊ธฐ ์ํด ํ์ฅ์๋ฅผ jsx ๋ก ํ๊ธฐํ๋๊ฒ ๋ฟ์ด๋ค.
์ปดํฌ๋ํธ์ฉ ํ์ผ์ผ ๊ฒฝ์ฐ jsx ํ์ฅ์๋ฅผ ์ฌ์ฉํด๋ ๋๋ค.
2.3. ๋ผ์ฐํฐ ์ฐ๊ฒฐํ๊ธฐ
2.3.1. ๋ผ์ฐํฐ ์ค์น
๋ผ์ฐํฐ(์ ํ๊ธฐ)๋ฅผ ์ฌ์ฉํ์ฌ ๋ผ์ฐํ (ํตํ)์ ํ๋ ๊ณผ์ ์ 3๋จ๊ณ๋ก ๋๋์ด๋ณด์.
- ๐ ์ ํ๊ธฐ๋ฅผ ์ฐ๋ค = ๋ผ์ฐํฐ ์ค์น
- ํต์ ์๋น์ค๋ฅผ ์ ์ฒญํ๋ค. = ํต์ ์๋น์ค๋ฅผ ์ค๊ฐํ๋ ๊ฐ์ฒด์ ์๋น์ค ์ ์ฒญ
- ์น๊ตฌํํ ์ ํ๊ฑด๋ค = ๋ผ์ฐํ ์ฐ๊ฒฐ
> Info: ๐ก `์ค์ํ์์ ์ฌ์ฉํ๋ ์ ํ๊ธฐ์ ์ข
๋ฅ๊ฐ ๋ค์ํ๋ฏ ๋ฆฌ์กํธ ๋ผ์ฐํฐ์ ์ข
๋ฅ๋ ๋ค์ํ๋ค.
>
> 2024๋
6์ ํ์ฌ reactrouter v6.23.1 ๊ธฐ์ค์ผ๋ก RouterComponents๋ ์๋ 6์ข
๋ฅ๊ฐ ์๋ค.
> 1. BroswerRouter
> 2. HashRouter
> 3. MemoryRouter
> 4. NativeRouter
> 5. Router
> 6. StaticRouter`
์ง๊ธ ์ฐ๋ฆฌ๋ ์ฌ๊ธฐ์ ๐ 1๋จ๊ณ ๋ฅผ ํ๋ ๊ฒ ์ด๋ค.
์ด ๋จ๊ณ๋ฅผ ๋งก๊ณ ์๋ย ๐createBrowserRouterย ์ด๋ผ๋ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด๋ณด์.
createBrowserRouterย ๊ฐ์ฒด๋ก ํน์ ์ปดํฌ๋ํธ๋ฅผ ๋ํํ๊ฒ ๋๋ฉด ํ์์ ์ปดํฌ๋ํธ๋ ๋ผ์ฐํฐ๋ฅผ ์ค์ ํ ์์๋ ๋ค์ํ ๊ฐ์ฒด๋ค์ ์์๋ฐ์ ์ฌ์ฉ ํ ์ ์๋ค.
2.3.2. createBrowserRouter ์ค์น
์ด API ๋ react-router v6.4 ์ ์๋ก ์ถ๊ฐ๋์๋ค. ๐Official
๋ผ์ฐํ
์๋น์ค๋ฅผ ์ด์ฉํ ์ปดํฌ๋ํธ๋ค์ ์ด ๊ฐ์ฒด๋ก ๋ํ๋์ด ์์ด์ผ ํ๋ค.
๋ํ ์๋ก ์ถ๊ฐ๋ loaders,actions,fetchers ๋ฑ์ API๋ฅผ ์ด์ฉํ๋ ค๋ฉด ์ด ๊ฐ์ฒด๋ก ๋ํ ๋์ด์ผ ํ๋ค.
์ด์ฐจํผ ์ฑ๋ด์ ์ปดํฌ๋ํธ๋ค์ ๋ชจ๋ ๋ผ์ฐํ
๋ ๊ฒ์ด๋ฏ๋ก ์ต์์ ์ปดํฌ๋ํธ์ ์์ฑํ์.
- ๊ฐ์ฒด ๊ตฌ์ฑํ์ธ
//index.js
import React from "react";
import ReactDOM from "react-dom/client";
import { createBrowserRouter } from "react-router-dom";
import "./index.css";
import App from "./App";
import Home from "./pages/Home";
console.log(createBrowserRouter([{}]));
const root = ReactDOM.createRoot(document.querySelector("#root"));
root.render(
<>
<Home />
<App />
</>
);

์ฝ์์ฐฝ์์ ๊ฐ์ฒด๊ฐ ๊ฐ์ง๊ณ ์๋ ๊ฐ์ ํ์ธํด๋ณด๋ฉด url ์ ๋ณด๊ฐ ๋ง์ด ๋ณด์ธ๋ค.
์ฐ๋ฆฌ๋ ์ด์ ํ์ํ ๋๋ง๋ค ์ด ์์ ๊ฐ์ฒด๋ค์ ์ฌ์ฉํด์ ๋ฆฌ์กํธ์ ์ปดํฌ๋ํธ ์ฐ๊ฒฐ์ ํ๋ ๊ฒ์ด๋ค.
- ๊ฐ์ฒด๋ฅผ ๋ณ์์ ํ ๋นํ ๋ผ์ฐํฐ ์ฐ๊ฒฐ
๐ 1. ์ ํ๊ธฐ๋ฅผ ์ฐ๋ค = ๋ผ์ฐํฐ ์ค์น
1. ํต์ ์๋น์ค๋ฅผ ์ ์ฒญํ๋ค. = ํต์ ์๋น์ค๋ฅผ ์ค๊ฐํ๋ ๊ฐ์ฒด์ ์๋น์ค ์ ์ฒญ
1. ์น๊ตฌํํ
์ ํ๊ฑด๋ค = ๋ผ์ฐํ
์ฐ๊ฒฐ
- path : ๊ฒฝ๋ก
- element: ๊ฒฝ๋ก์ ๊ทผ์ ์ด๋ฆด ์ปดํฌ๋ํธ
const router = createBrowserRouter([
{
path: "/",
element: <Home />,
},
]);
2.3.3. RouterProvider ์๋น์ค์ ์ฒญ
์ด API ๋ react-router v6.4 ์ ์๋ก ์ถ๊ฐ๋์๋ค. ๐Official
- ์ ํ๊ธฐ๋ฅผ ์ฐ๋ค = ๋ผ์ฐํฐ ์ค์น
๐ 2. ํต์ ์๋น์ค๋ฅผ ์ ์ฒญํ๋ค. = ํต์ ์๋น์ค๋ฅผ ์ค๊ฐํ๋ ๊ฐ์ฒด์ ์๋น์ค ์ ์ฒญ - ์น๊ตฌํํ
์ ํ๊ฑด๋ค = ๋ผ์ฐํ
์ฐ๊ฒฐ
์ค์ ํ ๋ผ์ฐํฐ์ ์ปดํฌ๋ํธ๋ฅผ ์ฐ๊ฒฐํ ๋๋ provider ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ค - RouterProvider ์ปดํฌ๋ํธ๋ฅผ ์ด์ฉํ๋ค
import React from "react";
import ReactDOM from "react-dom/client";
import { createBrowserRouter, RouterProvider } from "react-router-dom";
import "./index.css";
import App from "./App";
import Home from "./pages/Home";
const router = createBrowserRouter([
{
path: "/",
element: <Home />,
},
]);
const root = ReactDOM.createRoot(document.querySelector("#root"));
root.render(
<RouterProvider router={router}>
<Home /> <App />
</RouterProvider>
);
RouterProvider ๊ฐ์ฒด๋ router์์ฑ์ ํฌํจํ๊ณ ์๋ค.
์ด ์์ฑ์ ์ฐ๊ฒฐํ ์ปดํฌ๋ํธ์ ์ ๋ณด๋ฅผ ์ ๋ฌํ๋ฉด ๋ผ์ฐํ
์ด ์๋ฃ ๋๋ค.
- ์๋์ ๊ฐ์ด Home ์ปดํฌ๋ํธ๊ฐ ๋ผ์ฐํ ๋๊ฒ์ ๋ณผ์์๋ค.

- ๋ผ์ฐํฐ ์ถ๊ฐ ์์ฑ
//index.js
import Products from "./pages/Products";
//...์ค๋ต
const router = createBrowserRouter([
{
path: "/",
element: <Home />,
},
{
path: "/app",
element: <App />,
},
{
path: "/products",
element: <Products />,
},
]);
- ๋ธ๋ผ์ฐ์ ์ฃผ์์ฐฝ์ ์ค์ ํ ๊ฒฝ๋ก๋ฅผ ์ ๋ ฅํ๋ฉด ํ์ด์ง ์๋ก๊ณ ์นจ ์์ด ์ปดํฌ๋ํธ๊ฐ ์ด๋ํ๋ค.

2.4. Link
Link ์ปดํฌ๋ํธ๋ html์ a ํ๊ทธ๋ก ๋ณํ๋๋ค.
href ์์ฑ์ to ๋ผ๋ props๋ก ์์ฑํ๋ค.
- Home ์ปดํฌ๋ํธ์ aํ๊ทธ๋ก ๋งํฌ์์ฑ
//Home .js
import React from "react";
const Home = () => {
return (
<div>
<h1>Home</h1>
<a href="/products">Products</a>
</div>
);
};
export default Home;
- ํด๋ฆญํ๋ฉด ํ๋ฉด์ด ํ๋ฒ ๊น๋นก์ด๊ณ ์ด๋ํ๋ค.

์ด ๋ฐฉ๋ฒ์ ํ์ด์ง ๋ด์ ๋ชจ๋ ์ปดํฌ๋ํธ๋ฅผ ์๋ก๊ณ ์นจํ๊ฒ ๋๋ฉฐ SPA ๋ด์ ๋ชจ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ฆฌ๋ ๋ ํ๊ฒ ๋๋ค.
๋ฆฌ์กํธ ์ฑ์ ์์ ์ปดํฌ๋ํธ๊ฐ ๋ชจ์ฌ ํฐ ํ์ด์ง๋ฅผ ๋ง๋ ๋ค.
์์ ๋ฐฉ๋ฒ์ ๋ณ๊ฒฝ๋ด์ญ์ด ์๋ ์ปดํฌ๋ํธ ๊น์ง ๋ถํ์ํ๊ฒ ๋ฆฌ๋ ๋ ๋๋ฏ๋ก ์ฑ๋ฅ์ ํ๋ฅผ ์ ๋ฐํ๋ค.
- Link ์ปดํฌ๋ํธ๋ก ๋ณ๊ฒฝํ์
**//Home.js**
import { Link } from "react-router-dom";
const Home = (props) => {
return (
<>
<h1>Home</h1>
<Link to="/products">LINK-Product </Link>
<a href="/products">Products</a>
</>
);
};
export default Home;
- ํ๋ฉด์ ์๋ก๊ณ ์นจ ์์ด ์ด๋์ด ๋๋์ง ํ์ธํ๋ค

aํ๊ทธ๋ก ๋ณํ ๋์๋์ง๋ ํ์ธํ๋ค.

2.5. children
๋ผ์ฐํฐ ์ค์ ์ ๊ตฌ์กฐํ ํ ์ ์๋ ๋ฐฉ๋ฒ์ ์์๋ณด์
์ปดํฌ๋ํธ ๊ฐ์ ๊ด๊ณ์ ๋ฐ๋ผ ๋ผ์ฐํฐ๋ ๊ณ์ธตํ ํ๋ค๋ฉด ์ข์๊ฒ์ด๋ค.
- pages ํด๋์ ๋ชจ๋ ์ปดํฌ๋ํธ๋ฅผ ์ ์ดํ RootLayout ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ ๋ค.
์ด ์ปดํฌ๋ํธ๋ mpa์ index.html ๊ณผ ๊ฐ์ ์ญํ ์ ํ๋ค.
//src.js
import Navi from "./Navi";
const RootLayout = () => {
return (
<>
<h1>Root</h1> <Navi />
</>
);
};
export default RootLayout;
- Navi ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ๋ค.
///Navi.js
import { Link } from "react-router-dom";
import "./Navi.css";
const Navi = () => {
return (
<ul>
<li>
<Link to="/home">Home</Link>
</li>
<li>
<Link to="/products">Products</Link>
</li>
</ul>
);
};
export default Navi;
- Navi.css ๋ ์๋ ์ฝ๋๋ฅผ ๋ณต๋ถํ๋ค.
ul {
padding: 1rem;
display: flex;
position: fixed;
bottom: 0;
list-style: none;
gap: 2rem;
background-color: pink;
}
- index.js ๋ก ์ด๋ํ์ฌ router ์ ์์ฑ์ ์ถ๊ฐํ๋ค.
์ด๋ ํท๊ฐ๋ฆฌ๋ฏ๋ก root.render ํจ์๋ RouterProvider ๋ง ๋จ๊ฒจ๋๋๋ค
import RootLayout from './pages/RootLayout';
const router = createBrowserRouter([
{
path: '/',
element: <RootLayout />,
children: [
{
path: 'products',
element: <Products />,
},
{
path: 'home',
element: <Home />,
},
],
},
]);
...
root.render(<RouterProvider router={router} />);
๋ธ๋ผ์ฐ์ ์์ ํ
์คํธ ํด๋ณด๋ฉด ๊ฒฝ๋ก์ ์ด๋์ ๋๋๋ฐ ์ปดํฌ๋ํธ์ ๋ ๋๋ง์ด ๋์ง ์๋๋ค.
๋ผ์ฐํฐ ์ค์ ์ ์ ๋์์ผ๋ RootLayout ์์ Home๊ณผ Products ์ปดํฌ๋ํธ๋ฅผ ์ํฌํธ ํ์ง ์์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฆฌ์กํธ์ ์ปดํฌ๋ํธ๋ ์ด์ ์ด ๊ต์ฅํ ๋ถํธํ๋ค.
GNB๋ ๋ชจ๋ฌํ์
, ํจ๋๋ฉ๋ด ๊ฐ์ด ๋ชจ๋ ์ปดํฌ๋ํธ์ ํ์๋ผ์ผ ํ๋ UI์ ๊ฒฝ์ฐ ๋งค๋ฒ ์ํฌํธํด์ผ ํ๋ค.
ํ์ง๋ง ์ต์์ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์ด์ ์ ์ดํ๋ค๋ฉด ์ต์์์์ Outlet ์ด๋ผ๋ ์ปดํฌ๋ํธ๋ง ์์ฑํ๋ฉด ํด๊ฒฐํ ์ ์๋ค.
2.6. Outlet
์ค์ฒฉ๋ ๋ผ์ฐํธ๋ฅผ ๋ ๋๋งํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์ปดํฌ๋ํธ
React Router v6๋ถํฐ ๋์ ๋ Outlet์ ๋ถ๋ชจ ๋ผ์ฐํธ ๋ด์์ ์์ ๋ผ์ฐํธ๊ฐ ๋ ๋๋ง๋ ์์น๋ฅผ ์ง์ ํ๋ ์ญํ ์ ํ๋ค.
- RootLayout ์ Outlet ์ ์ํฌํธ ํ๋ค.
**//RootLayout.js
**
import { Outlet } from "react-router-dom";
import Navi from "./Navi";
const RootLayout = () => {
return (
<>
<h1>Root</h1> <Navi />
<Outlet />
</>
);
};
export default RootLayout;
๋ธ๋ผ์ฐ์ ์์ ํ ์คํธ ํด๋ณด๋ฉด Root์ Navi ๋ ๋ชจ๋ ์ปดํฌ๋ํธ์์ ํ์๋๋ฉฐ ์ปดํฌ๋ํธ๊ฐ ์ด๋๋ ์ ๋๋๊ฒ์ด ํ์ธ๋๋ค.
2.7. ย errorElement
react-router ์์ ์์ฒด์ ์ผ๋ก ์ ๊ณตํ๋ ์์ธ์ฒ๋ฆฌ๋ฌธ์ ์ฌ๋ฌ๊ฐ๊ฐ ์๋ค.
๊ทธ์ค ์๋ฌ์ํฉ ๋ฐ์์ ์ฌ์ฉํ ์ ์๋ ๊ฐ์ฒด๋ฅผ ์์๋ณด์ย ๐
- pages/Error.js ๋ฅผ ๋ง๋ค๊ณ 404 ๋ฉ์์ง๋ฅผ ์์ฑํ๋ค.
//pages/Error.js
import "./Error.css";
import Navi from "./Navi";
const ErrorPage = (props) => {
return (
<>
<Navi /> <div className="error">404Error</div>
</>
);
};
export default ErrorPage;
/*Error.css*/
.error {
width: 100vw;
height: 100vh;
font-size: 5vw;
color: white;
background-color: #ff0000;
}
- ๋ผ์ฐํฐ ์ค์ ์ถ๊ฐ
//index.js
import ErrorPage from './pages/Error';
{
path: '/',
element: <RootLayout />,
errorElement: <ErrorPage />,
children: [
{
path: 'products',
element: <Products />,
},
{
path: 'home',
element: <Home />,
},
],
},
]);
- ์ฃผ์์ฐฝ์ ์๋ ๊ฒฝ๋ก๋ฅผ ์ ๋ ฅํ๋ฉด ์๋ฌ์ปดํฌ๋ํธ๊ฐ ํ์ธ๋๋ค

2.8. useNavigate
์นํ์ด์ง ๊ฐ๋ฐ์ aํ๊ทธ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋งํฌ๋ฅผ ํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค.
์ด๋ฐ ์ํฉ์ ๋ฆฌ์กํธ์์๋ ์ด๋ป๊ฒ ํด๊ฒฐํ ์ ์์๊น?
useNavigate ํ
์ ์ดํํธ ๋ฑ์์ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ํ์ํ ์ ์๋ ํจ์๋ฅผ ๋ฐํํ๋ค.
React ์ ํ๋ฆฌ์ผ์ด์
์์ ํ์ด์ง ๊ฐ์ ํ์(navigation)์ ์ํํ๋ ํ
์ด๋ค.
- ์๋์ ๊ฐ์ด ์ฝ๋ฉํ๋ค
//src.js
import { Link, useNavigate } from "react-router-dom";
const Home = (props) => {
const navi = useNavigate();
const naviFn = () => {
navi("/App");
};
return (
<>
<h1>Home</h1>
<button onClick={naviFn}>click</button>
<Link to="/products">LINK-Product</Link> <a href="/products">Products</a>
</>
);
};
export default Home;
- index.js ๋ก ์ด๋ํ์ฌ ๋ผ์ฐํฐ๋ฅผ ์ค์ ํ๋ค.
//srcindex.js
const router = createBrowserRouter([
{
//...์ค๋ต
},
{
path:'/app',
element: <App />,
}
๋ฒํผ์ ํด๋ฆญํ๋ฉด App ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋๋ค.

์ด ์ฝ๋๋ ๋งํฌ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ํ๋ ๊ฒ์ด ์๋ ๋ฒํผ์ ํด๋ฆญ์ ํจ์๋ฅผ ํธ์ถํ๊ณ ๊ทธ ํจ์์์ ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ก ์ด๋ํ๊ธฐ ์ํ ๋ค๋น๊ฒ์ด์ ํ ์ ํธ์ถํ๋ ๋ฐฉ์์ด๋ค.
2. useParams (Part2)
2.9. ๋์ ๋ผ์ฐํ (useParams)
๐ขย ์๋๋ฆฌ์ค:
์ํํ์ด์ง์๋ ์ฌ๋ฌ๊ฐ์ ์ํ์ด ์๋ค.
๊ฐ ์ํ๋ณ ๋ฐ์ดํฐ๊ฐ ๋ค๋ฅด๋ฏ๋ก ์ํ์์ธํ์ด์ง๋ ์ํ๋ง๋ค ๊ฐ๊ฐ ๋ผ์ฐํฐ๋ฅผ ์์ฑํด์ผ ํ๋ค.
์ด๋ด ๊ฒฝ์ฐ ์ํ์ ๊ณ ์ ์๋ณ์์ useParams๋ฅผ ํ์ฉํ์ฌ ๋ผ์ฐํ
ํ๋ฉด ํธ๋ฆฌํ๋ค.
Info: ๐จ
useParams ๋?
**์๋ฏธ๋ฅผ ํ์ด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค
(โ๏พใฎ๏พ)โ **use(์ฌ์ฉํ๋ค)+Params(๋งค๊ฐ๋ณ์) = useParams(๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ๋ค)
- srcpagesProducts.js ์ ๊ตฌ์กฐ๋ฅผ ์ถ๊ฐํ์
//srcpagesProducts.js
import React from 'react';
const Products = () => {
return (
<>
<h1>Products</h1>
<ul>
<li>์ํ1</li>
<li>์ํ2</li>
<li>์ํ3</li>
</ul>
</>
);
};
export default Products;
- ์ํ์์ธํ์ด์ง ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ ๋ค
//srcpagesProductDetail.js
const ProductDetail = () => {
return <div>ProductDetail</div>;
};
export default ProductDetail;
- ๋ผ์ฐํฐ๋ฅผ ์์ฑํ๋ค
//srcindex.js
import React from 'react';
import ReactDOM from 'react-dom/client';
import { createBrowserRouter, RouterProvider } from 'react-router-dom';
import './index.css';
import App from './App';
import Home from './pages/Home';
import Products from './pages/Products';
import ProductDetail from './pages/ProductDetail';
import RootLayout from './pages/RootLayout';
import ErrorPage from './pages/Error';
const router = createBrowserRouter([
{
path: '/',
element: <RootLayout />,
errorElement: <ErrorPage />,
children: [
{
path: 'products',
element: <Products />,
},
{
path: 'products/detail',
element: <ProductDetail />,
},
{
path: 'home',
element: <Home />,
},
],
},
{
path: '/app',
element: <App />,
},
]);
// ...
์ํ์ ์์ด๋๋ ๊ด๋ฆฌ๋ฒํธ์ ๋ฐ๋ผ path ๋ ๋ณ๊ฒฝ๋์ผ ํ ๊ฒ์ด๋ค
- ๋์ ๊ฒฝ๋ก ์์ฑํ๊ธฐย
:
//srcindex.js
{ path: '/products/:id', element: <ProductDetail /> },
: ์ดํ์ ๊ฐ์ ๋์ ์ผ๋ก ์ฒ๋ฆฌ๋๋ค
- ํ์ธ
์ซ์ 5๋ฅผ ๋ฃ์ด๋ apple์ ๋ฃ์ด๋ ์์ธ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง ๋๋ค

- ์์ธ ํ์ด์ง์์ parameter ์ ๋ฐ์๋ณด์
์ ๋ฌํ๋ parameter ์ ๋ฐ์๋๋ยuseParamsย ๊ฐ ํ์ํ๋ค
//srcpagesProductDetail.js
import { useParams } from 'react-router-dom';
const ProductDetail = (props) => {
console.log(useParams());
return (
<>
<div>ProductDetail</div>
</>
);
};
export default ProductDetail;
- ํ์ธ

- id ์ ์ฅ
const {id}=useParams()
// ...
<div>{id}</div>
2.10.๋์ ๋งํฌ
Link ์ปดํฌ๋ํธ์ to props๋ฅผ ๋์ ์ผ๋ก ์ฒ๋ฆฌํด๋ณด์
- srcpagesProducts.js ๋ก ์ด๋ํ Link ์ปดํฌ๋ํธ๋ฅผ ์ถ๊ฐํ๋ค
- ์ํ๋ค์ ์ผ๋ฐ์ ์ผ๋ก ๋ฐฑ์๋ ์๋ฒ์์ ๋ฐ์์ค๊ฒ ์ง๋ง ์ง๊ธ์ ์์๋ก ์์ฑํํ map์ผ๋ก ๋ถ๋ฌ์จ๋ค
- Link to ์ ํ ํ๋ฆฟ๋ฆฌํฐ๋ด์ ์ฌ์ฉํ์ฌ ์์ฑ์ ์ ๋ฌํ๋ฉด ๋์ ์ผ๋ก ๋งํฌ์ฃผ์๋ฅผ ์์ฑํ ์ ์๋ค
//src/pages/Products.js
import { Link } from 'react-router-dom';
const PRODUCTS = [
{ id: '1', title: '์ํ1' },
{ id: '2', title: '์ํ2' },
{ id: '3', title: '์ํ3' },
];
const Products = () => {
return (
<>
<h1>Products</h1>
<ul>
{PRODUCTS.map((item) => (
<li key={item.id}>
<Link to={`/products/${item.id}`}>{item.title}</Link>
</li>
))}
</ul>
</>
);
};
export default Products;
- ์ง์

2.11. Router Path
createBrowserRouter ํจ์๊ฐ ๋ฐํํ๋ ์ฌ๋ฌ ๊ฐ์ฒด์ค์๋ ๊ฒฝ๋ก ์ค์ ํค์ธ path์ ์์ฑ์ ๋ค์ํ ์ต์ ์ ์ถ๊ฐํ ์ ์๋ค
2.11.1. ์๋๊ฒฝ๋ก
Info: ๐ก router ์ children ๋ฐฐ์ด์ path ์์ฑ์์ / ๋ฅผ ์ญ์ ํ๋ค๋๊ฒ์ ํด๋น ๊ฒฝ๋ก๋ฅผ ์๋๊ฒฝ๋ก๋ก ๋ณ๊ฒฝํ๋ค๋ ์๋ฏธ์ด๋ค.
//src/index.js
import { createBrowserRouter, RouterProvider } from 'react-router-dom';
import Home from './pages/Home';
import Products from './pages/Products';
import ProductDetail from './pages/ProductDetail';
import RootLayout from './pages/Root';
import ErrorPage from './pages/Error';
const router = createBrowserRouter([
{
path: '/',
element: <RootLayout />,
errorElement: <ErrorPage />,
children: [
{ path: '', element: <Home /> },
{ path: 'products', element: <Products /> },
{ path: 'products/:id', element: <ProductDetail /> },
],
},
]);
const App = () => {
return <RouterProvider router={router} />;
};
export default App;


product.js ์ Link ๋ฅผ ๋ณด์

์๋๊ฒฝ๋ก๋ก ์์ ํ๋ค


//srcpagesProducts.js
//...
{PRODUCTS.map((item) => (
<li key={item.id}>
<Link to={item.id}>{item.title}</Link>
</li>
//...
Info: ๐ก srcpagesProductDetail.js ์ ๋ค๋ก๊ฐ๊ธฐ ๋ฒํผ์ ์๋ ๊ฒฝ๋ก๋ก ๋ฃ์ด๋ณด์
//srcpagesProductDetail.js
import { useParams, Link } from 'react-router-dom';
const ProductDetail = () => {
const params = useParams();
return (
<div>
<h1>ProductDetail</h1>
<div>{params.id}</div>
<div>
<Link to='..'>Back</Link>
</div>
</div>
);
};
export default ProductDetail;


์ํ ์์ธ ํ์ด์ง์์ ์ํ ํ์ด์ง๋ก ์ด๋ ํ๋ ๊ฒ์ด ์๋๋ผ ๋ฐ๋ก ํ์ผ๋ก ์ด๋ํ๋ค.
์ด์ ๋ ์์ธํ์ด์ง ์ ์ํ ํ์ด์ง๋ ํ์ ๊ด๊ณ์ด๊ธฐ ๋๋ฌธ์ด๋ค
์์ ํด๋ณด์
//srcpagesProductDetail.js
//...
<div><Link to=".." relative="path">Back</Link></div>
relative ์์ฑ์ path ๋ฅผ ์ฌ์ฉํ๋ฉด path ๋จ์๋ก ์ด๋์ด ๊ฐ๋ฅํ๋ค
2.11.2. index ๋ผ์ฐํธ
๋ฉ์ธ ์ปดํฌ๋ํธ์ ์ค์ ํ ์ ์๋ index ์์ฑ์ ์ฌ์ฉํด๋ณด์
//srcindex.js
import { createBrowserRouter, RouterProvider } from 'react-router-dom';
import Home from './pages/Home';
import Products from './pages/Products';
import ProductDetail from './pages/ProductDetail';
import RootLayout from './pages/Root';
import ErrorPage from './pages/Error';
const router = createBrowserRouter([
{
path: '/',
element: <RootLayout />,
errorElement: <ErrorPage />,
children: [
{ index: true, element: <Home /> },
{ path: 'products', element: <Products /> },
{ path: 'products/:id', element: <ProductDetail /> },
],
},
]);
const App = () => {
return <RouterProvider router={router} />;
};
export default App;
์ด ํค๋ ๋น path ๋์ ๋ฉ์ธ ์ปดํฌ๋ํธ๋ฅผ ์ง์ ํ ์ ์๋ ์์ฑ์ด๋ค.
//src/index.js
import { createBrowserRouter, RouterProvider } from 'react-router-dom';
import Home from './pages/Home';
import Products from './pages/Products';
import ProductDetail from './pages/ProductDetail';
import RootLayout from './pages/Root';
import ErrorPage from './pages/Error';
const router = createBrowserRouter([
{
path: '/',
element: <RootLayout />,
errorElement: <ErrorPage />,
children: [
{ index: true, element: <Home /> },
{ path: 'products', element: <Products /> },
{ path: 'products/:id', element: <ProductDetail /> },
],
},
]);
const App = () => {
return <RouterProvider router={router} />;
};
export default App;