codeStates front-end/React

[React] SPA, Router

ํ™˜ํ…Œํฌ 2023. 1. 25. 15:56
๋ฐ˜์‘ํ˜•

 

 

 

 

 

 

 

๐Ÿ“Œ๋ฆฌ์•กํŠธ ๊ฐœ๋…

 

 

๐Ÿ“SPA( Single-Page Application )

 

์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์™„์ „ํ•œ ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€๋ฅผ ๋ถˆ๋Ÿฌ์˜ค์ง€ ์•Š๊ณ  ํŽ˜์ด์ง€์— ๊ฐฑ์‹ ์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ๋ฐ›์•„

๊ทธ ์ •๋ณด๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ˜„์žฌ์˜ ํŽ˜์ด์ง€๋ฅผ ์—…๋ฐ์ดํŠธํ•จ์œผ๋กœ์จ ์‚ฌ์šฉ์ž์™€ ์†Œํ†ตํ•˜๋Š” ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋‚˜ ์›น ์‚ฌ์ดํŠธ

 

 

์ „ํ†ต์ ์ธ ์›น์‚ฌ์ดํŠธ - ํŽ˜์ด์ง€๋ฅผ ์ด๋™ ์‹œ "ํŽ˜์ด์ง€ ์ „์ฒด"๋ฅผ ๋ถˆ๋Ÿฌ์™€์•ผํ•จ

SPA - ํŽ˜์ด์ง€ ์ด๋™ ์‹œ ์ค‘๋ณต ๋˜๋Š” ๋ถ€๋ถ„์€ ๋ถˆ๋Ÿฌ ์˜ค์ง€ x

          ์ค‘๋ณต ๋˜๋Š” ํ—ค๋”, ํ‘ธํ„ฐ๋Š” ๋ƒ…๋‘๊ณ , ์ปจํ…ํŠธ๋งŒ ๋ฐ”๊พผ๋‹ค๋Š” ๋œป

 

 

SPA  ์žฅ์ 

 

ํŽ˜์ด์ง€ ์ „์ฒด๋ฅผ ๋Ÿฐ๋ฐ๋ง ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ฏ€๋กœ ์‚ฌ์šฉ์ž์˜ ํ–‰๋™์— ๋น ๋ฅด๊ฒŒ ๋ฐ˜์‘

 

SPA  ๋‹จ์ 

 

์ฒซ ํ™”๋ฉด์˜ ๋กœ๋”ฉ ์‹œ๊ฐ„์ด ๊ธธ์–ด์ง

๊ฒ€์ƒ‰ ์—”์ง„(์ž๋ฃŒ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ธฐ ์ข‹๋„๋ก ์›น ํŽ˜์ด์ง€๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ) ์ตœ์ ํ™”๊ฐ€ ์ข‹์ง€ ์•Š์Œ

 

 

๐Ÿงท Wireframe๊ณผ Mockup

 

Wireframe - ์›นํŽ˜์ด์ง€์˜ ๋ ˆ์ด์•„์›ƒ๊ณผ UI ์š”์†Œ ๋“ฑ์— ๋Œ€ํ•œ ๋ผˆ๋Œ€

Mockup - ๋ฐ๋ชจ ์‹œ์—ฐ, ํ‰๊ฐ€๋ฅผ ์œ„ํ•œ ์ตœ์†Œํ•œ์˜ ๊ธฐ๋Šฅ๋งŒ ๋‹ด์€ ๋ชจํ˜•

 

 

 

๐Ÿ“Router

๋‹ค๋ฅธ ์ฃผ์†Œ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋ทฐ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๊ณผ์ • "๊ฒฝ๋กœ์— ๋”ฐ๋ผ ๋ณ€๊ฒฝํ•œ๋‹ค"

 

 

React Router ํ™œ์šฉ

 

BrowserRouter : ๋ผ์šฐํ„ฐ ์—ญํ• 

Routes์™€ Route : ๊ฒฝ๋กœ๋ฅผ ๋งค์นญ

Link :  ๊ฒฝ๋กœ๋ฅผ ๋ณ€๊ฒฝ

 

 

๐Ÿ”ปReact Router ์‹ค์Šต

 

 

๋ณธ ์‹ค์Šต์€ ์ฝ”๋“œ์Šคํ…Œ์ด์ธ ์—์„œ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

 

 

 

์ฝ”๋”ฉ๋ถ€ํŠธ์บ ํ”„ | ์ฝ”๋“œ์Šคํ…Œ์ด์ธ  - ๋น„์ „๊ณต์ƒ๋„ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

์ฝ”๋”ฉ๋ถ€ํŠธ์บ ํ”„๋ฅผ ์ฐพ๋Š”๋‹ค๋ฉด? ๊ฐœ๋ฐœ์ž๋กœ ์ปค๋ฆฌ์–ด ์ „ํ™˜์„ ์œ„ํ•œ ์ฑ…์ž„์žˆ๋Š” ์ฝ”๋”ฉ ๊ต์œก ๊ธฐ๊ด€! ์„œ๋น„์Šค ๊ธฐํš์ž, ๊ทธ๋กœ์Šค ๋งˆ์ผ€ํ„ฐ, ๋ฐ์ดํ„ฐ ์‚ฌ์ด์–ธํ‹ฐ์ŠคํŠธ ๋“ฑ ๋‹ค์–‘ํ•œ ์ „๋ฌธ ์ปค๋ฆฌ์–ด์— ๋„์ „ํ•˜์„ธ์š”. ์ทจ์—… ์„ฑ๊ณต์˜ ํ›„๊ธฐ

www.codestates.com

 

Bare Minimum requirements

  • Create React App ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑ ํ›„, React Router(react-router-dom) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • React Router์˜ ์ฃผ์š” ์ปดํฌ๋„ŒํŠธ๋“ค์„ ์ด์šฉํ•ด ์ฃผ์†Œ์— ๋”ฐ๋ฅธ 3๊ฐ€์ง€ ๋ทฐ( Home, MyPage, Dashboard )๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • Home ํŽ˜์ด์ง€์˜ ์ฃผ์†Œ "/"
    • MyPage ํŽ˜์ด์ง€์˜ ์ฃผ์†Œ "/mypage"
    • Dashboard ํŽ˜์ด์ง€์˜ ์ฃผ์†Œ "/dashboard"

 

 

1. ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๊ตฌ์ถ•

 

npx create-react-app@latest simpleroute
cd simpleroute
npm start


npm install react-router-dom@^6.3.0
# ์ด๋ฒˆ ์Šคํ”„๋ฆฐํŠธ์—์„œ๋Š” 6.3.0 ๋ฒ„์ „์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค

 

vs code๋ฅผ ์—ด๋ฆฌ๋ฉด package.json ์—์„œ react router dom์ด ์ž˜ ์„ค์น˜๋˜์—ˆ๋Š”์ง€ ํ™•์ธ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

App.js

 

router๋ฅผ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ž˜ ์†Œ์Šค๋ฅผ ์ž…๋ ฅ

 

import React from 'react'
import { BrowserRouter, Routes, Route, Link } from "react-router-dom"; // ์ด ๊ตฌ๋ฌธ์„ ๋„ฃ์–ด์ฃผ์„ธ์š”

 

2. ๋ผ์šฐํ„ฐ ์ค€๋น„

 

์ปดํฌ๋„ŒํŠธ Home, MyPage, Dashboard

 

// Home ์ปดํฌ๋„ŒํŠธ
function Home() {
  return <h1>Home</h1>;
}

// MyPage ์ปดํฌ๋„ŒํŠธ
function MyPage() {
  return <h1>MyPage</h1>;
}

// Dashboard ์ปดํฌ๋„ŒํŠธ
function Dashboard() {
  return <h1>Dashboard</h1>;
}

 

3. ๋ฉ”๋‰ด ๋งŒ๋“ค๊ธฐ

 

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

export default App;

 

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

 

  • Home ํŽ˜์ด์ง€์˜ ์ฃผ์†Œ "/"
  • MyPage ํŽ˜์ด์ง€์˜ ์ฃผ์†Œ "/mypage"
  • Dashboard ํŽ˜์ด์ง€์˜ ์ฃผ์†Œ "/dashboard"

BrowerRouter

 

function App () {
  return (
    <BrowserRouter> // router๋ฅผ ์ƒ์œ„์— ์ž…๋ ฅ
      <div>
        <nav>
          <ul>
            <li>
              Home
            </li>
            <li>
             MyPage
            </li>
            <li>
              Dashboard
            </li>
          </ul>
        </nav>
      </div>
    </BrowserRouter>
  )
}

export default App;

 

index.js(React V - 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>
);

 

index.js(React V - 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 ์†์„ฑ์œผ๋กœ ์—ฐ๊ฒฐํ•˜๊ณ ์ž ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋„ฃ์–ด์คŒ

 

App.js

 

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;

ํŒ : ๋งŒ์•ฝ ์‚ฌ์šฉ์ž๊ฐ€ ์ง€์ •๋œ ์ฃผ์†Œ์ธ “/’, “/mypage”, “/dashboard” ์ด์™ธ์˜ ์ฃผ์†Œ๋กœ ์ ‘๊ทผํ•˜๊ฒŒ ๋˜๋ฉด ์˜๋„ํ•œ ํ™”๋ฉด์ด ๋ณด์ด์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿด ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์†์„ฑ์ด path=”*” ์ž…๋‹ˆ๋‹ค. ์ง€์ •๋˜์ง€ ์•Š์€ ์ฃผ์†Œ๋กœ ์ ‘๊ทผํ•  ์‹œ์—๋Š” ์ด ์†์„ฑ์ด ์„ค์ •๋˜์–ด ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ณด์—ฌ์ฃผ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

Link

 

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

 

<a> ์š”์†Œ๋ฅผ ์“ฐ์ง€ ์•Š๋Š” ์ด์œ ๋Š”?

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

์ฆ‰, ์ƒˆ๋กœ๊ณ ์นจ๊ณผ ๊ฐ™๋‹ค

 

  • <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;

 

 

์‹คํ–‰ ์‹œ ๋งํฌ์— ๋”ฐ๋ผ ํŽ˜์ด์ง€๊ฐ€ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค ๐Ÿ˜€

 

๋ฐ˜์‘ํ˜•