Frontend/React

[React] React Router(๋ฆฌ์•กํŠธ ๋ผ์šฐํ„ฐ) ์‚ฌ์šฉํ•˜๊ธฐ

_์„ฑํ˜ธ_ 2022. 7. 27. 17:52
728x90
๋ฐ˜์‘ํ˜•

SPA ๊ธฐ๋ฒ•์„ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•œ ์ƒํƒœ๋กœ REACT์—์„œ ํŽ˜์ด์ง€ ์ด๋™ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ React Router๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค.

๋ผ์šฐํŒ…์ด๋ž€?

- ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•œ URL์— ๋”ฐ๋ผ ํ•ด๋‹น URL์— ๋งž๋Š” ํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์‰ฝ๋‹ค.

- ๋ฆฌ์•กํŠธ์—๋Š” ๋ผ์šฐํŒ… ๊ด€๋ จ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ, ๊ทธ ์ค‘ ๋ฆฌ์•กํŠธ ๋ผ์šฐํ„ฐ(React Router)๋ฅผ ์‚ฌ์šฉํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

 

React Router(๋ฆฌ์•กํŠธ ๋ผ์šฐํ„ฐ)๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

- ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ์ฃผ์†Œ๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ์—ญํ• ์„ ํ•˜๋ฉฐ, ์—ฌ๋Ÿฌ ํ™˜๊ฒฝ์—์„œ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ ๋ผ์šฐํ„ฐ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

์ข…๋ฅ˜

- BrowserRouter: HTML5๋ฅผ ์ง€์›ํ•˜๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ์ง€ํ•œ๋‹ค.

- HashRouter: ํ•ด์‹œ ์ฃผ์†Œ๋ฅผ ๊ฐ์ง€ํ•œ๋‹ค.

 

React Router(๋ฆฌ์•กํŠธ ๋ผ์šฐํ„ฐ) ์‚ฌ์šฉํ•ด๋ณด๊ธฐ! (โ— React Router v6)

1) ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

$ yarn create react-app router-test

 

2) ํ•ด๋‹น ํ”„๋กœ์ ํŠธ์— ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜ 

$ yarn add react-router-dom

 

3) app.js ํŒŒ์ผ์— ๊ฒฝ๋กœ ๊ตฌ์„ฑ

import React from 'react';
import { BrowserRouter, Route, Routes } from 'react-router-dom';
import './App.css';
import Home from './components/home';
import MyPage from './components/mypage';

function App() {
  return (
    <BrowserRouter>
      <Routes>
      	// '/'๋กœ ์ ‘๊ทผํ•  ๊ฒฝ์šฐ Home ์ปดํฌ๋„ŒํŠธ๋กœ ๋ Œ๋”๋ง
        <Route path='/' exact element={<Home />} />
        <Route path='/home' element={<Home />} />
        <Route path='/mypage' element={<MyPage />} />
      </Routes>
    </BrowserRouter>
  );
}

export default App;

- BrowserRouter๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ ํ•ด๋ณผ ์˜ˆ์ •์ด๋ฏ€๋กœ, < BrowserRouter> ํƒœ๊ทธ๋กœ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐ์‹ธ์ค€๋‹ค.

- <Routes> ์ปดํฌ๋„ŒํŠธ๋Š” ์—ฌ๋Ÿฌ <Route>๋ฅผ ๊ฐ์‹ธ์„œ ๊ทธ ์ค‘ ๊ฒฝ๋กœ๊ฐ€ ์ผ์น˜ํ•˜๋Š” ๋‹จ ํ•˜๋‚˜๋งŒ ๋ Œ๋”๋ง ์‹œ์ผœ์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

- <Route>๋Š” path ์†์„ฑ์— ๊ฒฝ๋กœ, element ์†์„ฑ์—  ๋ณด์—ฌ์ฃผ๊ณ ์ž ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋„ฃ์–ด์ค€๋‹ค.

 

(1) home.jsx

import React from 'react';

const Home = (props) => {
  return (
    <>
      <h1>Home</h1>
      <button>Go to MyPage</button>
    </>
  );
};

export default MyPage;

 

(2) mypage.jsx

import React from 'react';

const MyPage = (props) => {
  return (
    <>
      <h1>MyPage</h1>
      <button>Go to Home</button>
    </>
  );
};

export default MyPage;

 

4) Navigation(ํŽ˜์ด์ง€ ์ด๋™)

(1) useNavigate

ex) home.jsx (mypage.jsx๋„ ๋™์ผํ•˜๊ฒŒ ์ˆ˜์ •)

import React from 'react';
import { useNavigate } from 'react-router-dom';

const Home = (props) => {
  const navigate = useNavigate();
  return (
    <>
      <h1>Home</h1>
      <button
        onClick={() => {
          navigate('/mypage');
        }}
      >
        Go to MyPage
      </button>
    </>
  );
};

export default Home;

(2) Link

import React from 'react';
import { BrowserRouter, Route, Routes, Link } from 'react-router-dom';
import './App.css';
import Home from './components/home';
import MyPage from './components/mypage';

function App() {
  return (
    <BrowserRouter>
      <nav>
        <Link to='/home'>Home</Link>
        <Link to='/mypage'>MyPage</Link>
      </nav>
      <Routes>
        <Route path='/' exact element={<Home />} />
        <Route path='/home' element={<Home />} />
        <Route path='/mypage' element={<MyPage />} />
      </Routes>
    </BrowserRouter>
  );
}

export default App;

 

5) Result

(1) http://localhost:3000/home

(2) http://localhost:3000/mypage

 

Reference

https://reactrouter.com/docs/en/v6/upgrading/v5

 

React Router | Upgrading from v5

Declarative routing for React apps at any scale

reactrouter.com