๐Ÿ–ฅFrontEnd/React

TIL) ๋ฆฌ์•กํŠธ, React Router, ๋ฆฌ์•กํŠธ ๋ผ์šฐํ„ฐ, React SPA ๊ฐœ๋ฐœ, BrowserRouter, Routes, Route, Link

hellohailie 2022. 6. 8. 23:16

 

์ปดํฌ๋„ŒํŠธ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์™œ ๊ณ ๋ฏผ์ด ํ•„์š”ํ•œ๊ฐ€์š”??

 

โžฅ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์•ˆ์—์„œ ๋‹ค๋ค„์ง€๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ปดํฌ๋„ŒํŠธ๋“ค๋ผ๋ฆฌ ๋ณด๋‹ค ์œ ๊ธฐ์ ์œผ๋กœ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—

 

 

React๋ฅผ ์ด์šฉํ•ด ์–ด๋–ป๊ฒŒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค์ง€ ์„ค๊ณ„๋ฅผ ํ•œ๋‹ค๋ฉด ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค๊ธฐ ์ „์—, ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  ์ด๋“ค์„ ์กฐํ•ฉํ• ์ง€๋ถ€ํ„ฐ ๊ตฌ์ƒํ•  ๊ณ„ํš์„ ์งœ์•ผํ•œ๋‹ค!!


<React Router ์ด์šฉํ•ด์„œ React SPA(Single-Page Application) ๊ฐœ๋ฐœํ•˜๊ธฐ>

 

SPA๋Š” ํ•˜๋‚˜์˜ ํŽ˜์ด์ง€๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ, ํ•œ ์ข…๋ฅ˜์˜ ํ™”๋ฉด๋งŒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

WHY? ๐Ÿค”

ํŽ˜์ด์ง€ ์•ˆ์˜ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๊ฐ ๋ฒ„ํŠผ์— ๋Œ€ํ•œ ํŽ˜์ด์ง€ ํ™”๋ฉด์ด ํ•„์š”ํ•˜๋‹ˆ๊นŒ!

๋˜ํ•œ ์ด ํ™”๋ฉด์— ๋”ฐ๋ผ '์ฃผ์†Œ'๋„ ๋‹ฌ๋ผ์ง„๋‹ค!

 

๋ผ์šฐํŒ…(Routing) = ๋‹ค๋ฅธ ์ฃผ์†Œ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋ทฐ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๊ณผ์ • / ๊ฒฝ๋กœ์— ๋”ฐ๋ผ ๋ณ€๊ฒฝํ•œ๋‹ค. 

 

BUT๐Ÿ˜ฌ

React ์ž์ฒด์—๋Š” ์ด ๊ธฐ๋Šฅ์ด ๋‚ด์žฅ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘ ์ฃผ์†Œ๋งˆ๋‹ค ๋‹ค๋ฅธ ๋ทฐ๋ฅผ ๋ณด์—ฌ์ค˜์•ผํ•œ๋‹ค. 

 

๐Ÿ‘‡ React SPA์—์„œ๋Š” ๋ผ์šฐํŒ…์„ ์œ„ํ•ด React Router๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค. 

 


React Router์˜ ์ฃผ์š” ์ปดํฌ๋„ŒํŠธ

<BrowserRouter> = ๋ผ์šฐํ„ฐ ์—ญํ• ์„ ํ•œ๋‹ค. 

<Routes> = ๊ฒฝ๋กœ๋ฅผ ๋งค์นญํ•ด์ค€๋‹ค. 

<Route> = ๊ฒฝ๋กœ๋ฅผ ๋งค์นญํ•ด์ค€๋‹ค. 

<Link> = ๊ฒฝ๋กœ๋ฅผ ๋ณ€๊ฒฝํ•ด์ค€๋‹ค. 

 

๐Ÿ‘‡ ์ด ์ปดํฌ๋„ŒํŠธ๋“ค์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” React Router ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๋”ฐ๋กœ ๋ถˆ๋Ÿฌ์™€์•ผ ํ•œ๋‹ค. 

 

import{BrowserRouter,Routes,Route,Link} from "react-router-dom";

 

import๋Š” ํ•„์š”ํ•œ ๋ชจ๋“ˆ์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. (๋น„๊ตฌ์กฐํ™” ํ• ๋‹น(destructuring assignment)๊ณผ ๋น„์Šทํ•˜๊ฒŒ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. )

 

 


React Router ์‚ฌ์šฉ ํ™˜๊ฒฝ ์„ธํŒ…

1. react-router ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜

npx create-react-app simpleroute // simpleroute ํด๋”์— React App ์„ค์น˜
cd simpleroute

npm install react-router-dom@^6.3.0 // react-router ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜

 

2. App.js๋กœ react-router ์ปดํฌ๋„ŒํŠธ ๊บผ๋‚ด์˜ค๊ธฐ

import React from "react";
import{BrowserRouter,Routes,Route,Link} from "react-router-dom";

export default function App() {
	return (...)
}

 


<์ฃผ์†Œ์— ๋”ฐ๋ผ ํŽ˜์ด์ง€ ๋ทฐ ๋‹ค๋ฅด๊ฒŒ ๋งŒ๋“ค๊ธฐ>

 

App.js ์— ๋ผ์šฐํŒ…์„ ํ•˜๊ธฐ ์œ„ํ•œ React Router์˜ ์ฃผ์š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์„ธํŒ…ํ•˜๊ธฐ!

์ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ด์šฉํ•ด์„œ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” "์ฃผ์†Œ์— ๋”ฐ๋ฅธ ๋‹ค๋ฅธ ํŽ˜์ด์ง€"๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

BrowserRouter

<BrowserRouter> ์ปดํฌ๋„ŒํŠธ๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ HTML5์˜ History API๋ฅผ ์‚ฌ์šฉํ•ด ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ๊ณ ์นจํ•˜์ง€ ์•Š๊ณ ๋„ ์ฃผ์†Œ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค. ๋˜ํ•œ <BrowserRouter> ๊ฐ€ ์ƒ์œ„์— ์ž‘์„ฑ๋˜์–ด ์žˆ์–ด์•ผ React Router์˜ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

(tip)

๋ธŒ๋ผ์šฐ์ €๋ผ์šฐํ„ฐ๋Š” react-router-dom ์•ˆ์— ์žˆ๋Š” ๊ทธ ๋ฌด์—‡๋ณด๋‹ค ์œ„์—๋งŒ ์žˆ์œผ๋ฉด ๋˜๋Š”๊ฑฐ๋‹ค. 

๐Ÿ‘‡

ReactDOM์˜ ๋ Œ๋” ๋‹จ๊ณ„์ธ index.js ์— <BrowserRouter>๋ฅผ ๋„ฃ์–ด์„œ ํ™œ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

 

 

๐Ÿ‘‡์˜ˆ์‹œ 1) index.js (React Version 18 ๊ธฐ์ค€)

import React from 'react';
import ReactDOM from 'react-dom';
import { BrowserRouter } from 'react-router-dom';

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <React.StrictMode>
    <BrowserRouter>
      <App />
    </BrowserRouter>
  </React.StrictMode>
);

 

๐Ÿ‘‡์˜ˆ์‹œ 2) index.js (React Version 17 ๊ธฐ์ค€)

import React from 'react';
import ReactDOM from 'react-dom';
import { BrowserRouter } from 'react-router-dom';

ReactDOM.render(<BrowserRouter><App/></BrowserRouter>, document.querySelector('#root'));

Routes, Route

๊ฒฝ๋กœ๋ฅผ ๋งค์นญํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์ด๋‹ค.

 

  • <Routes> ์ปดํฌ๋„ŒํŠธ๋Š” ์—ฌ๋Ÿฌ <Route> ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐ์‹ธ์„œ ๊ทธ์ค‘ ๊ฒฝ๋กœ๊ฐ€ ์ผ์น˜ํ•˜๋Š” ๋‹จ ํ•˜๋‚˜์˜ ๋ผ์šฐํ„ฐ๋งŒ ๋ Œ๋”๋ง์„ ์‹œ์ผœ์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. <Routes> ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ๋งค์นญ๋˜๋Š” ๋ชจ๋“  ์š”์†Œ๋ฅผ ๋ Œ๋”๋งํ•œ๋‹ค.
  • <Route> ์ปดํฌ๋„ŒํŠธ๋Š” path ์†์„ฑ์„ ์ง€์ •ํ•˜์—ฌ ํ•ด๋‹น path ์—์„œ ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ณด์—ฌ์ค„์ง€ ์ •ํ•œ๋‹ค.  <Link> ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ •ํ•ด์ฃผ๋Š” URL ๊ฒฝ๋กœ์™€ ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ž‘๋™๋œ๋‹ค.

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

 

ํŒ : ๋งŒ์•ฝ ์‚ฌ์šฉ์ž๊ฐ€ ์ง€์ •๋œ ์ฃผ์†Œ์ธ “/’, “/mypage”, “/dashboard” ์ด์™ธ์˜ ์ฃผ์†Œ๋กœ ์ ‘๊ทผํ•˜๊ฒŒ ๋˜๋ฉด ์˜๋„ํ•œ ํ™”๋ฉด์ด ๋ณด์ด์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿด ๋•Œ path=”*” ์œผ๋กœ ์„ค์ •ํ•˜๋ฉด, ์ง€์ •๋˜์ง€ ์•Š์€ ์ฃผ์†Œ๋กœ ์ ‘๊ทผํ•  ์‹œ์—๋Š” ์ด ์†์„ฑ์ด ์„ค์ •๋˜์–ด ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ณด์—ฌ์ฃผ๊ฒŒ ๋œ๋‹ค.

 

function App () {
  return (
   <BrowserRouter>
      <div>
        <nav>
          <ul>
            <li>
              Home
            </li>
            <li>
              MyPage
            </li>
            <li>
              Dashboard
            </li>
          </ul>
        </nav>

    {/* ์ฃผ์†Œ ๊ฒฝ๋กœ์™€ ์•„๊นŒ ๋งŒ๋“  3๊ฐœ์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์—ฐ๊ฒฐํ•ด ์ค๋‹ˆ๋‹ค. */}
       {/* Routes ์ปดํฌ๋„ŒํŠธ๋Š” Route ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๊ฐ์‹ธ๊ณ  ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. */}
        <Routes>
          {/* ๊ฒฝ๋กœ๋Š” path๋กœ ์ปดํฌ๋„ŒํŠธ๋Š” element๋กœ ์—ฐ๊ฒฐํ•ด ์ค๋‹ˆ๋‹ค. */}
          <Route path="/" element={<Home />} /> 
          <Route path="/mypage" element={<MyPage />} /> 
          <Route path="/dashboard" element={<Dashboard />} />
        </Routes>
      </div>
   </BrowserRouter>
  )
}

export default App;

 


Link

๊ฒฝ๋กœ๋ฅผ ์—ฐ๊ฒฐํ•ด ์ฃผ๋Š” ์—ญํ• ์„ ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์ด๋‹ค.

ํŽ˜์ด์ง€ ์ „ํ™˜์„ ํ†ตํ•ด ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ ๋ถˆ๋Ÿฌ์˜ค์ง€ ์•Š๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜์—ฌ HTML5 History API๋ฅผ ์ด์šฉํ•ด ํŽ˜์ด์ง€์˜ ์ฃผ์†Œ๋งŒ ๋ณ€๊ฒฝํ•ด์ค€๋‹ค.

 

React Router์—์„œ <a> ์š”์†Œ๊ฐ€ ์•„๋‹Œ <Link>๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ??

โžฅ <a> ์š”์†Œ๋Š” ํŽ˜์ด์ง€๋ฅผ ์ „ํ™˜ํ•˜๋Š” ๊ณผ์ •์—์„œ ํŽ˜์ด์ง€๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์‹œ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ Œ๋”๋ง์„ ์‹œํ‚จ๋‹ค. (์ƒˆ๋กœ๊ณ ์นจ ํ˜„์ƒ)

ํ•˜์ง€๋งŒ <Link> ์ปดํฌ๋„ŒํŠธ๋Š” ํŽ˜์ด์ง€ ์ „ํ™˜์„ ๋ฐฉ์ง€ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ๋‚ด์žฅ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— SPA๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

  • <Link> ์˜ to ์†์„ฑ์„ ํ™œ์šฉํ•˜์—ฌ <Route> ์ปดํฌ๋„ŒํŠธ์— ์„ค์ •ํ•ด ์ค€ path ์ฃผ์†Œ๋ฅผ ์—ฐ๊ฒฐํ•ด์ค€๋‹ค.
function App() {
  return (
    <BrowserRouter>
      <div>
        <nav>
          <ul>
            <li>
              <Link to="/">Home</Link>{/* Link ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฒฝ๋กœ๋ฅผ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค */}
            </li>
            <li>
              <Link to="/mypage">MyPage</Link>
            </li>
            <li>
              <Link to="/dashboard">Dashboard</Link>
            </li>
          </ul>
        </nav>

         <Routes>
          <Route path="/" element={<Home />} /> 
					{/* ๊ฒฝ๋กœ๋Š” path๋กœ ์ปดํฌ๋„ŒํŠธ๋Š” element๋กœ ์—ฐ๊ฒฐํ•ด ์ค๋‹ˆ๋‹ค. */}
          <Route path="/mypage" element={<MyPage />} /> 
          <Route path="/dashboard" element={<Dashboard />} />
        </Routes>
      </div>
    </BrowserRouter>
  );
}

function Home() {
  return <h1>Home</h1>;
}

function MyPage() {
  return <h1>MyPage</h1>;
}

function Dashboard() {
  return <h1>Dashboard</h1>;
}

export default App;