router

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 ํด๋”๋ฅผ ๋ฎ์–ด ์”Œ์šด๋‹ค.

  1. 2๋ฒˆ์˜ ํด๋”๋ฅผ ๋ฃจํŠธ๋กœ ์„ ํƒํ•˜์—ฌ vscode๋ฅผ ์—ฐ๋‹ค.
  2. 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์ดํ›„๋ฅผ ์ค‘์ ์ ์œผ๋กœ ๋‹ค๋ฃฌ๋‹ค.

  1. ๋ชจ๋“ˆ์„ค์น˜
  2. ์—ด๋ ค์žˆ๋Š” ๊ฐœ๋ฐœ์„œ๋ฒ„๋ฅผ ๋‹ซ๊ณ  vscode ํ„ฐ๋ฏธ๋„ ์ฐฝ์— ์•„๋ž˜์˜ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ›„ ์„ค์น˜ํ•œ๋‹ค.
npm i react-router
  1. ์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
npm run dev

2.2. ์ปดํฌ๋„ŒํŠธ ์ž‘์„ฑ

์—ฐ์Šตํ•  ์ปดํฌ๋„ŒํŠธ ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ•œ๋‹ค.

๐Ÿ”—snippets ์„ค์ •ํ•˜๊ธฐ

  1. ์•„๋ž˜ ๊ตฌ์กฐ๋Œ€๋กœ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค
/srcโ”€โ”ฌโ”€
     โ””โ”€โ”€/pages โ”€โ”ฌ
                โ”œโ”€โ”€Home.jsx
                โ””โ”€โ”€Products.jsx
  1. 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๋‹จ๊ณ„๋กœ ๋‚˜๋ˆ„์–ด๋ณด์ž.

  1. ๐Ÿ‘‰ ์ „ํ™”๊ธฐ๋ฅผ ์‚ฐ๋‹ค = ๋ผ์šฐํ„ฐ ์„ค์น˜
  2. ํ†ต์‹ ์„œ๋น„์Šค๋ฅผ ์‹ ์ฒญํ•œ๋‹ค. = ํ†ต์‹ ์„œ๋น„์Šค๋ฅผ ์ค‘๊ฐœํ•˜๋Š” ๊ฐ์ฒด์— ์„œ๋น„์Šค ์‹ ์ฒญ
  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๋ฅผ ์ด์šฉํ•˜๋ ค๋ฉด ์ด ๊ฐ์ฒด๋กœ ๋ž˜ํ•‘ ๋˜์–ด์•ผ ํ•œ๋‹ค.
์–ด์ฐจํ”ผ ์•ฑ๋‚ด์˜ ์ปดํฌ๋„ŒํŠธ๋“ค์€ ๋ชจ๋‘ ๋ผ์šฐํŒ… ๋ ๊ฒƒ์ด๋ฏ€๋กœ ์ตœ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์— ์ž‘์„ฑํ•˜์ž.

  1. ๊ฐ์ฒด ๊ตฌ์„ฑํ™•์ธ
//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. ํ†ต์‹ ์„œ๋น„์Šค๋ฅผ ์‹ ์ฒญํ•œ๋‹ค. = ํ†ต์‹ ์„œ๋น„์Šค๋ฅผ ์ค‘๊ฐœํ•˜๋Š” ๊ฐ์ฒด์— ์„œ๋น„์Šค ์‹ ์ฒญ
1. ์นœ๊ตฌํ•œํ…Œ ์ „ํ™”๊ฑด๋‹ค = ๋ผ์šฐํŒ… ์—ฐ๊ฒฐ
  1. path : ๊ฒฝ๋กœ
  2. element: ๊ฒฝ๋กœ์ ‘๊ทผ์‹œ ์—ด๋ฆด ์ปดํฌ๋„ŒํŠธ
const router = createBrowserRouter([
  {
    path: "/",
    element: <Home />,
  },
]);

2.3.3. RouterProvider ์„œ๋น„์Šค์‹ ์ฒญ

์ด API ๋Š” react-router v6.4 ์— ์ƒˆ๋กœ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค. ๐Ÿ”—Official

  1. ์ „ํ™”๊ธฐ๋ฅผ ์‚ฐ๋‹ค = ๋ผ์šฐํ„ฐ ์„ค์น˜
    ๐Ÿ‘‰ 2. ํ†ต์‹ ์„œ๋น„์Šค๋ฅผ ์‹ ์ฒญํ•œ๋‹ค. = ํ†ต์‹ ์„œ๋น„์Šค๋ฅผ ์ค‘๊ฐœํ•˜๋Š” ๊ฐ์ฒด์— ์„œ๋น„์Šค ์‹ ์ฒญ
  2. ์นœ๊ตฌํ•œํ…Œ ์ „ํ™”๊ฑด๋‹ค = ๋ผ์šฐํŒ… ์—ฐ๊ฒฐ
    ์„ค์ •ํ•œ ๋ผ์šฐํ„ฐ์™€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์—ฐ๊ฒฐํ• ๋•Œ๋Š” provider ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค
  3. 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์†์„ฑ์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค.
์ด ์†์„ฑ์— ์—ฐ๊ฒฐํ•  ์ปดํฌ๋„ŒํŠธ์˜ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ๋ผ์šฐํŒ…์ด ์™„๋ฃŒ ๋œ๋‹ค.

  1. ์•„๋ž˜์™€ ๊ฐ™์ด Home ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ผ์šฐํŒ… ๋œ๊ฒƒ์„ ๋ณผ์ˆ˜์žˆ๋‹ค.

  1. ๋ผ์šฐํ„ฐ ์ถ”๊ฐ€ ์ž‘์„ฑ
//index.js

import Products from "./pages/Products";
//...์ค‘๋žต
const router = createBrowserRouter([
  {
    path: "/",
    element: <Home />,
  },
  {
    path: "/app",
    element: <App />,
  },
  {
    path: "/products",
    element: <Products />,
  },
]);
  1. ๋ธŒ๋ผ์šฐ์ € ์ฃผ์†Œ์ฐฝ์— ์„ค์ •ํ•œ ๊ฒฝ๋กœ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ํŽ˜์ด์ง€ ์ƒˆ๋กœ๊ณ ์นจ ์—†์ด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ด๋™ํ•œ๋‹ค.


2.4. Link

Link ์ปดํฌ๋„ŒํŠธ๋Š” html์˜ a ํƒœ๊ทธ๋กœ ๋ณ€ํ™˜๋œ๋‹ค.

href ์†์„ฑ์€ to ๋ผ๋Š” props๋กœ ์ž‘์„ฑํ•œ๋‹ค.

  1. Home ์ปดํฌ๋„ŒํŠธ์— aํƒœ๊ทธ๋กœ ๋งํฌ์ƒ์„ฑ
//Home .js
import React from "react";
const Home = () => {
  return (
    <div>
      <h1>Home</h1>
      <a href="/products">Products</a>
    </div>
  );
};
export default Home;
  1. ํด๋ฆญํ•˜๋ฉด ํ™”๋ฉด์ด ํ•œ๋ฒˆ ๊นœ๋นก์ด๊ณ  ์ด๋™ํ•œ๋‹ค.

์ด ๋ฐฉ๋ฒ•์€ ํŽ˜์ด์ง€ ๋‚ด์˜ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒˆ๋กœ๊ณ ์นจํ•˜๊ฒŒ ๋˜๋ฉฐ SPA ๋‚ด์˜ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌ๋ Œ๋” ํ•˜๊ฒŒ ๋œ๋‹ค.
๋ฆฌ์•กํŠธ ์•ฑ์€ ์ž‘์€ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ชจ์—ฌ ํฐ ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ ๋‹ค.
์œ„์˜ ๋ฐฉ๋ฒ•์€ ๋ณ€๊ฒฝ๋‚ด์—ญ์ด ์—†๋Š” ์ปดํฌ๋„ŒํŠธ ๊นŒ์ง€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ฆฌ๋ Œ๋” ๋˜๋ฏ€๋กœ ์„ฑ๋Šฅ์ €ํ•˜๋ฅผ ์œ ๋ฐœํ•œ๋‹ค.

  1. 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;
  1. ํ™”๋ฉด์˜ ์ƒˆ๋กœ๊ณ ์นจ ์—†์ด ์ด๋™์ด ๋˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค

aํƒœ๊ทธ๋กœ ๋ณ€ํ™˜ ๋˜์—ˆ๋Š”์ง€๋„ ํ™•์ธํ•œ๋‹ค.

2.5. children

๋ผ์šฐํ„ฐ ์„ค์ •์„ ๊ตฌ์กฐํ™” ํ• ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์ž

์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ ๊ด€๊ณ„์— ๋”ฐ๋ผ ๋ผ์šฐํ„ฐ๋„ ๊ณ„์ธตํ™” ํ•œ๋‹ค๋ฉด ์ข‹์„๊ฒƒ์ด๋‹ค.

  1. pages ํด๋”์— ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ œ์–ดํ•  RootLayout ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ ๋‹ค.
    ์ด ์ปดํฌ๋„ŒํŠธ๋Š” mpa์˜ index.html ๊ณผ ๊ฐ™์€ ์—ญํ• ์„ ํ•œ๋‹ค.
//src.js
import Navi from "./Navi";
const RootLayout = () => {
  return (
    <>
      <h1>Root</h1> <Navi />
    </>
  );
};
export default RootLayout;
  1. 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;
  1. Navi.css ๋Š” ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ๋ณต๋ถ™ํ•œ๋‹ค.
ul {
  padding: 1rem;
  display: flex;
  position: fixed;
  bottom: 0;
  list-style: none;
  gap: 2rem;
  background-color: pink;
}
  1. 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์€ ๋ถ€๋ชจ ๋ผ์šฐํŠธ ๋‚ด์—์„œ ์ž์‹ ๋ผ์šฐํŠธ๊ฐ€ ๋ Œ๋”๋ง๋  ์œ„์น˜๋ฅผ ์ง€์ •ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

  1. 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 ์—์„œ ์ž์ฒด์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฌธ์€ ์—ฌ๋Ÿฌ๊ฐœ๊ฐ€ ์žˆ๋‹ค.

๊ทธ์ค‘ ์—๋Ÿฌ์ƒํ™ฉ ๋ฐœ์ƒ์‹œ ์‚ฌ์šฉํ• ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ์•Œ์•„๋ณด์žย ๐Ÿ”—

  1. 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;
}
  1. ๋ผ์šฐํ„ฐ ์„ค์ • ์ถ”๊ฐ€
//index.js
import ErrorPage from './pages/Error';
   {
      path: '/',
      element: <RootLayout />,
      errorElement: <ErrorPage />,
      children: [
         {
            path: 'products',
            element: <Products />,
         },
         {
            path: 'home',
            element: <Home />,
         },
      ],
   },
]);
  1. ์ฃผ์†Œ์ฐฝ์— ์—†๋Š” ๊ฒฝ๋กœ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์—๋Ÿฌ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ™•์ธ๋œ๋‹ค

2.8. useNavigate

์›นํŽ˜์ด์ง€ ๊ฐœ๋ฐœ์‹œ aํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งํฌ๋ฅผ ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

์ด๋Ÿฐ ์ƒํ™ฉ์„ ๋ฆฌ์•กํŠธ์—์„œ๋Š” ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ• ์ˆ˜ ์žˆ์„๊นŒ?
useNavigate ํ›…์€ ์ดํŽ™ํŠธ ๋“ฑ์—์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํŽ˜์ด์ง€ ๊ฐ„์˜ ํƒ์ƒ‰(navigation)์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ›…์ด๋‹ค.

  1. ์•„๋ž˜์™€ ๊ฐ™์ด ์ฝ”๋”ฉํ•œ๋‹ค
//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;
  1. index.js ๋กœ ์ด๋™ํ•˜์—ฌ ๋ผ์šฐํ„ฐ๋ฅผ ์„ค์ •ํ•œ๋‹ค.
//srcindex.js
const router = createBrowserRouter([
{
   //...์ค‘๋žต
},
{
 path:'/app',
 element: <App />,
}

๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด App ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง๋œ๋‹ค.

์ด ์ฝ”๋“œ๋Š” ๋งํฌ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋™ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๋ฒ„ํŠผ์„ ํด๋ฆญ์‹œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ๊ทธ ํ•จ์ˆ˜์—์„œ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๋กœ ์ด๋™ํ•˜๊ธฐ ์œ„ํ•œ ๋„ค๋น„๊ฒŒ์ด์…˜ ํ›…์„ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.


2. useParams (Part2)

2.9. ๋™์ ๋ผ์šฐํŒ…(useParams)

๐Ÿ“ขย ์‹œ๋‚˜๋ฆฌ์˜ค:

์ƒํ’ˆํŽ˜์ด์ง€์—๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ƒํ’ˆ์ด ์žˆ๋‹ค.
๊ฐ ์ƒํ’ˆ๋ณ„ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ค๋ฅด๋ฏ€๋กœ ์ƒํ’ˆ์ƒ์„ธํŽ˜์ด์ง€๋Š” ์ƒํ’ˆ๋งˆ๋‹ค ๊ฐ๊ฐ ๋ผ์šฐํ„ฐ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.
์ด๋Ÿด ๊ฒฝ์šฐ ์ƒํ’ˆ์˜ ๊ณ ์œ  ์‹๋ณ„์ž์™€ useParams๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ผ์šฐํŒ… ํ•˜๋ฉด ํŽธ๋ฆฌํ•˜๋‹ค.

Info: ๐Ÿจ

useParams ๋ž€?

**์˜๋ฏธ๋ฅผ ํ’€์–ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค
(โ˜ž๏พŸใƒฎ๏พŸ)โ˜ž **use(์‚ฌ์šฉํ•˜๋‹ค)+Params(๋งค๊ฐœ๋ณ€์ˆ˜) = useParams(๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค)

  1. 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;
  1. ์ƒํ’ˆ์ƒ์„ธํŽ˜์ด์ง€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ ๋‹ค
//srcpagesProductDetail.js

const ProductDetail = () => {
 return <div>ProductDetail</div>;
};
export default ProductDetail;
  1. ๋ผ์šฐํ„ฐ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค
//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 ๋Š” ๋ณ€๊ฒฝ๋˜์•ผ ํ• ๊ฒƒ์ด๋‹ค

  1. ๋™์ ๊ฒฝ๋กœ ์ž‘์„ฑํ•˜๊ธฐย :
//srcindex.js

{ path: '/products/:id', element: <ProductDetail /> },

: ์ดํ›„์˜ ๊ฐ’์€ ๋™์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค

  1. ํ™•์ธ
    ์ˆซ์ž 5๋ฅผ ๋„ฃ์–ด๋„ apple์„ ๋„ฃ์–ด๋„ ์ƒ์„ธ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง ๋œ๋‹ค

  1. ์ƒ์„ธ ํŽ˜์ด์ง€์—์„œ parameter ์„ ๋ฐ›์•„๋ณด์ž
    ์ „๋‹ฌํ•˜๋Š” parameter ์„ ๋ฐ›์„๋•Œ๋Š”ย useParamsย ๊ฐ€ ํ•„์š”ํ•˜๋‹ค
//srcpagesProductDetail.js

import { useParams } from 'react-router-dom';

const ProductDetail = (props) => {
	console.log(useParams());

	return (
		<>
			<div>ProductDetail</div>
		</>
	);
};
export default ProductDetail;
  1. ํ™•์ธ

  1. id ์ €์žฅ
const {id}=useParams()
  // ...
 <div>{id}</div>

2.10.๋™์ ๋งํฌ

Link ์ปดํฌ๋„ŒํŠธ์˜ to props๋ฅผ ๋™์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ด๋ณด์ž

  1. srcpagesProducts.js ๋กœ ์ด๋™ํ›„ Link ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค
  2. ์ƒํ’ˆ๋“ค์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„์—์„œ ๋ฐ›์•„์˜ค๊ฒ ์ง€๋งŒ ์ง€๊ธˆ์€ ์ƒ์ˆ˜๋กœ ์ž‘์„ฑํ•œํ›„ map์œผ๋กœ ๋ถˆ๋Ÿฌ์˜จ๋‹ค
  3. 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;
  1. ์งœ์ž”

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;

3. ์™„๋ฃŒํŒŒ์ผ

๋Œ“๊ธ€ ๋‚จ๊ธฐ๊ธฐ