๐ฑ React Router
- React ์ดํ๋ฆฌ์ผ์ด์ ์์ ํด๋ผ์ด์ธํธ ์ธก ๋ผ์ฐํ ์ ๊ตฌํํ๋๋ฐ ์ฌ์ฉ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- SPA( Single Page Application, ๋จ์ผ ํ์ด์ง ์ดํ๋ฆฌ์ผ์ด์ )๋ฅผ ๊ฐ๋ฐํ ๋, ์ฌ์ฉ์๊ฐ ๋ค์ํ URL๋ก ์ด๋ํ๊ฑฐ๋ ํ์ด์ง๋ฅผ ๋ณ๊ฒฝํ ์ ์๋๋ก ๋์์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- ๊ฒฝ๋ก ์ด๋์์๋ ์ฒ์๋ถํฐ ๋ค์ ๋ก๋ํ์ง ์๊ณ ํด๋น ์ปดํฌ๋ํธ๋ง ๋ฆฌ๋ ๋๋ง
์ปดํฌ๋ํธ ๊ธฐ๋ฐ: ๊ฒฝ๋ก๋ฅผ ์ด๋ํ ๋ ๋ง๋ค ์ปดํฌ๋ํธ๋ฅผ ์ ๋ฐ์ดํธ ๋ ๋๋ง
URL ๊ฐ์: ํ์ฌ URL์ ํ์ธํ๊ณ , URL์ด ๋ณ๊ฒฝ๋ ๋ ๋ง๋ค ๋ผ์ฐํ ์ฒ๋ฆฌ
๋งค์นญ๊ณผ ๋ ๋๋ง: ํ์ฌ URL์ ๋ฑ๋ก๋ ๊ฒฝ๋ก์ ๋น๊ตํ์ฌ ์ผ์นํ๋ ๊ฒฝ๋ก์ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋ง
์ค์ฒฉ ๋ผ์ฐํ : ์ค์ฒฉ๋ ๋ผ์ฐํธ๋ฅผ ์ง์ํ์ฌ ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ์กฐ๋ฅผ ๋ณด๋ค ์ฝ๊ฒ ์ฒ๋ฆฌ
๋ฆฌ๋ค์ด๋ ์ ๊ณผ 404์ฒ๋ฆฌ: ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฆฌ๋ค์ด๋ ์ ์ ์ฒ๋ฆฌํ๊ณ ์๋ ๊ฒฝ๋ก๋ก ์ ๊ทผํ ๋ 404 ํ์ด์ง ํ์
๋ธ๋ผ์ฐ์ history ๊ด๋ฆฌ: ๋ธ๋ผ์ฐ์ ์ history๋ฅผ ๊ด๋ฆฌํ์ฌ ๋ค๋ก๊ฐ๊ธฐ์ ์์ผ๋ก ๊ฐ๊ธฐ๋ฅผ ์ง์ํ๊ณ ๋ธ๋ผ์ฐ์ ์ ์ฃผ์ ํ์คํ ๋ฆฌ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉด์ URL ์ ๋ฐ์ดํธ
Hooks ์ฌ์ฉ: useHistory
, useLocation
, useParams
, useRouteMatch
๋ฑ ์ ํ
์ ์ฌ์ฉํ์ฌ ๋ ์ฝ๊ฒ URL์ ๊ด๋ฆฌํ๊ณ ๋ผ์ฐํ
์ ์ฝ๊ฒ ํจ
๐ฑ ๊ธฐ์กด์ BrowserRouter ๋ฐฉ์์์
createBrowserRouter
๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝ๋จ !
npm install react-router-dom@latest
/ yarn add react-router-dom@latest
๋ฒ์ ํ์ธ ๋ฐฉ๋ฒ
npm show react-router-dom version
yarn info react-router-dom version
์ด์ ๋ฒ์ ์ ๊ฑฐํ๊ธฐ
npm uninstall react-router-dom
yarn remove react-router-dom
๐ฑ ๊ฐ path์ ๋ง๋ element๋ฅผ ๋งค์นญํ์ฌ ๋ด๋ณด๋ด๋ ์ญํ
createBrowserRouter
๋ฅผ react-router-dom ์์ importpath
์ element
/ ์ค์ฒฉ ๋ผ์ฐํ
์ ์ํ children
/products
, ์์: /products/detail
... )index: true
๋ path: ''
๋ก ์ง์ import { createBrowserRouter } from 'react-router-dom';
// ์ ์ฒด ์ปดํฌ๋ํธ์ root๊ฐ ๋ ์ต์์ ์ปดํฌ๋ํธ import
import Root from './routes/root';
// ๋ผ์ฐํ
ํ๊ณ ์ถ์ ๊ฐ๊ฐ์ ํ์ด์ง ๋ชจ๋ import
import App from './App'; // App.js ๋ Root.js
import NotFound from './pages/NotFound';
import Main from './pages/Main/Main';
import Products from './pages/Products/Products';
import Detail from './pages/Detail/Detail';
export const Router = createBrowserRouter([
{
path: '/',
element: <App />,
errorElement: <NotFound />,
children: [
{
index: true,
element: <Main />,
},
{
path: 'products',
element: <Products />
},
{
path: 'products/:productId',
element: <Detail />
},
],
},
]);
React
, ReactDom
๊ฐ๊ฐ importRouteProvider
๋ฅผ react-router-dom์์ importRouter
๋ฅผ Router.js์์ importReactDOM.createRoot(...).render
๋ฅผ ํตํด Router๋ฅผ provider์์ ๋ฃ๋๋ค.import React from "react";
import ReactDOM from "react-dom/client";
import { RouterProvider } from "react-router-dom";
import { Router } from "./Router";
ReactDOM.createRoot(document.getElementById("root")).render(
<RouterProvider router={Router} />
);
Outlet
์ react-router-dom์์ importimport { Outlet } from 'react-router-dom';
import Nav from './components/Nav/Nav';
import Footer from './components/Footer/Footer';
import './App.css';
const App = () => {
return (
<div className = 'App'>
<Nav /> // ๊ณ ์
<Outlet /> // URL๋ฐ๋ผ ๋ณ๊ฒฝ๋๋ ๋ถ๋ถ
<Footer /> // ๊ณ ์
</ div>
);
}
export default App;