ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [React] SPA, Router
    codeStates front-end/React 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;

     

     

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

     

    ๋ฐ˜์‘ํ˜•

    ๋Œ“๊ธ€

Designed by Tistory.