๐Ÿšฆ React Router

Yeonnยท2024๋…„ 6์›” 13์ผ
0

React

๋ชฉ๋ก ๋ณด๊ธฐ
1/2
post-thumbnail

๐ŸŒฑ React Router

  • React ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํด๋ผ์ด์–ธํŠธ ์ธก ๋ผ์šฐํŒ…์„ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • SPA( Single Page Application, ๋‹จ์ผ ํŽ˜์ด์ง€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ )๋ฅผ ๊ฐœ๋ฐœํ•  ๋•Œ, ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค์–‘ํ•œ URL๋กœ ์ด๋™ํ•˜๊ฑฐ๋‚˜ ํŽ˜์ด์ง€๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • ๊ฒฝ๋กœ ์ด๋™์‹œ์—๋„ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ๋กœ๋“œํ•˜์ง€ ์•Š๊ณ  ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋งŒ ๋ฆฌ๋ Œ๋”๋ง

โœ”๏ธย React Router์˜ ์ฃผ์š” ๊ธฐ๋Šฅ

  • ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜: ๊ฒฝ๋กœ๋ฅผ ์ด๋™ํ•  ๋•Œ ๋งˆ๋‹ค ์ปดํฌ๋„ŒํŠธ๋ฅผ ์—…๋ฐ์ดํŠธ ๋ Œ๋”๋ง

  • URL ๊ฐ์‹œ: ํ˜„์žฌ URL์„ ํ™•์ธํ•˜๊ณ , URL์ด ๋ณ€๊ฒฝ๋  ๋•Œ ๋งˆ๋‹ค ๋ผ์šฐํŒ… ์ฒ˜๋ฆฌ

  • ๋งค์นญ๊ณผ ๋ Œ๋”๋ง: ํ˜„์žฌ URL์„ ๋“ฑ๋ก๋œ ๊ฒฝ๋กœ์™€ ๋น„๊ตํ•˜์—ฌ ์ผ์น˜ํ•˜๋Š” ๊ฒฝ๋กœ์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋ง

  • ์ค‘์ฒฉ ๋ผ์šฐํŒ…: ์ค‘์ฒฉ๋œ ๋ผ์šฐํŠธ๋ฅผ ์ง€์›ํ•˜์—ฌ ๋ณต์žกํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์กฐ๋ฅผ ๋ณด๋‹ค ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌ

  • ๋ฆฌ๋‹ค์ด๋ ‰์…˜๊ณผ 404์ฒ˜๋ฆฌ: ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฆฌ๋‹ค์ด๋ ‰์…˜์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์—†๋Š” ๊ฒฝ๋กœ๋กœ ์ ‘๊ทผํ•  ๋•Œ 404 ํŽ˜์ด์ง€ ํ‘œ์‹œ

  • ๋ธŒ๋ผ์šฐ์ € history ๊ด€๋ฆฌ: ๋ธŒ๋ผ์šฐ์ €์˜ history๋ฅผ ๊ด€๋ฆฌํ•˜์—ฌ ๋’ค๋กœ๊ฐ€๊ธฐ์™€ ์•ž์œผ๋กœ ๊ฐ€๊ธฐ๋ฅผ ์ง€์›ํ•˜๊ณ  ๋ธŒ๋ผ์šฐ์ €์˜ ์ฃผ์†Œ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉด์„œ URL ์—…๋ฐ์ดํŠธ

  • Hooks ์‚ฌ์šฉ: useHistory, useLocation, useParams, useRouteMatch ๋“ฑ ์˜ ํ›…์„ ์‚ฌ์šฉํ•˜์—ฌ ๋” ์‰ฝ๊ฒŒ URL์„ ๊ด€๋ฆฌํ•˜๊ณ  ๋ผ์šฐํŒ…์„ ์‰ฝ๊ฒŒ ํ•จ

โœ”๏ธย React Router( createBrowserRouter ) ์„ค์น˜ํ•˜๊ธฐ

๐ŸŒฑ ๊ธฐ์กด์˜ BrowserRouter ๋ฐฉ์‹์—์„œ createBrowserRouter ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝ๋จ !

React Router ์„ค์น˜

npm install react-router-dom@latest / yarn add react-router-dom@latest

  • ๋ฒ„์ „ ํ™•์ธ ๋ฐฉ๋ฒ•

    • package.json ํŒŒ์ผ ํ™•์ธ
    • npm: npm show react-router-dom version
    • yarn: yarn info react-router-dom version
  • ์ด์ „ ๋ฒ„์ „ ์ œ๊ฑฐํ•˜๊ธฐ

    • npm: npm uninstall react-router-dom
    • yarn: yarn remove react-router-dom


โœ”๏ธย Router.js

๐ŸŒฑ ๊ฐ path์— ๋งž๋Š” element๋ฅผ ๋งค์นญํ•˜์—ฌ ๋‚ด๋ณด๋‚ด๋Š” ์—ญํ• 

  • createBrowserRouter๋ฅผ react-router-dom ์—์„œ import
  • ๊ฐ ํŽ˜์ด์ง€์—์„œ ๋ณด์—ฌ์ค„ path์™€ element / ์ค‘์ฒฉ ๋ผ์šฐํŒ…์„ ์œ„ํ•œ children
  • ๋ฐฐ์—ด ์•ˆ์— ๋‹ด๊ธด ๊ฐ์ฒด ํ˜•ํƒœ๋กœ ๋‹ด์•„์„œ export
  • ๊ฐ€์žฅ ์ƒ๋‹จ์˜ ํŽ˜์ด์ง€๊ฐ€ ๋ถ€๋ชจ, children์œผ๋กœ ๋“ค์–ด์˜ค๋Š” ํŽ˜์ด์ง€๊ฐ€ ์ž์‹ ํŽ˜์ด์ง€
    ๋ถ€๋ชจ โ†’ ์ž์‹: path๊ฐ€ ์ด์–ด์ง„๋‹ค( ex: ๋ถ€๋ชจ: /products , ์ž์‹: /products/detail... )
  • children ์„ ํ†ตํ•ด ์ค‘์ฒฉ ๋ผ์šฐํŒ…
  • main page๋Š” 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 />
			},			
		],
	},
]);


โœ”๏ธย index.js

๐ŸŒฑ ์–ด๋–ค ๊ฒƒ์„ ๋ Œ๋”๋งํ•˜์—ฌ ๋”์— ๊ทธ๋ฆด์ง€ ์ž‘์„ฑ
  • src ์— index.js ์ƒ์„ฑ
  • React, ReactDom ๊ฐ๊ฐ import
  • RouteProvider๋ฅผ react-router-dom์—์„œ import
  • Router๋ฅผ Router.js์—์„œ import
  • ReactDOM.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} />
);


โœ”๏ธย App.js

๐ŸŒฑ **์ „์ฒด์ ์ธ ๋ ˆ์ด์•„์›ƒ**์„ ๋‚˜ํƒ€๋‚ด๋Š” ํŽ˜์ด์ง€
  • src ์— App.js( Root.js ๋„ ๋จ ) ์ƒ์„ฑ
  • Outlet์„ react-router-dom์—์„œ import
  • ํ™”๋ฉด์— ํ•ญ์ƒ ๋ Œ๋”๋ง ๋˜์–ด์•ผํ•˜์ง€๋งŒ ํŽ˜์ด์ง€ ์ „ํ™˜์ด ํ•„์š”ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ์ด ํŽ˜์ด์ง€์— import
    • ๋ผ์šฐํŒ…๊ณผ ์ƒ๊ด€์—†์ด ํ•ญ์ƒ ํ™”๋ฉด์— ๋œจ๋Š” ๊ณ ์ •์ ์ธ ์ปดํฌ๋„ŒํŠธ๋“ค !
    • ex) Nav.js, Footer.js โ€ฆ
import { 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;

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