TIL 19: React ๊ธฐ์ดˆ - SPA

SPA 

SPA๋Š” Single Page Application์˜ ์•ฝ์ž์ž…๋‹ˆ๋‹ค.

๋ง ๊ทธ๋Œ€๋กœ ํŽ˜์ด์ง€๋ฅผ ์˜ฎ๊ธธ ๋•Œ ๋‹ค๋ฅธ ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ

ํ•˜๋‚˜์˜(Single) ํŽ˜์ด์ง€ ๋‚ด์—์„œ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ๋ฐ›์•„์„œ ํ•ด๋‹นํ•˜๋Š” ๋ถ€๋ถ„๋งŒ ์—…๋ฐ์ดํŠธํ•˜๋Š” ํŽ˜์ด์ง€๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.

์™„์ „ํžˆ ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ํ™”๋ฉด์„ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๋ฐ

 

์žฅ์ : ํŽ˜์ด์ง€ ์ด๋™ ์‹œ ๋ณ€ํ•˜๋Š” ๋ถ€๋ถ„๋งŒ ๋กœ๋”ฉํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ ๋ถ€ํ•˜ ๊ฑธ๋ฆด ํ™•๋ฅ  ๋‚ฎ์Šต๋‹ˆ๋‹ค.

๋‹จ์ : ๋น„์–ด์žˆ๋Š” HTML์— ๋น„ํ•ด JavaScript ํŒŒ์ผ์€ ๋ฌด๊ฒ๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‹œ๊ฐ„์œผ๋กœ ์ธํ•ด ๋กœ๋”ฉ ์‹œ๊ฐ„ ๊ธธ์–ด์ง‘๋‹ˆ๋‹ค.


๋˜ํ•œ ๊ฒ€์ƒ‰์—”์ง„ ์ตœ์ ํ™”์—๋Š” ์ข‹์ง€ ์•Š๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์šฐ์„  ๊ฒ€์ƒ‰์—”์ง„์˜ ์ž‘๋™๋ฐฉ์‹์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž๋ฉด ๊ฒ€์ƒ‰ ๋กœ๋ด‡์ด ์›นํŽ˜์ด์ง€์˜ ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ ๋ฐ ๋ถ„์„์„ ํ†ตํ•ด ๊ฒฐ๊ณผ๊ฐ’์— ์ธ๋ฑ์Šค๋ฅผ ๋ถ™์—ฌ ๋ณด๊ด€ํ•ฉ๋‹ˆ๋‹ค.

์ดํ›„ ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒ€์ƒ‰ํ•˜๋ฉด ๋ณด๊ด€ํ•จ์— ์žˆ๋˜ ์ธ๋ฑ์Šค ์ค‘ ๊ฒ€์ƒ‰์–ด์™€ ์—ฐ๊ด€์„ฑ์ด ๋†’์€ ์ˆœ๋Œ€๋กœ ์›นํŽ˜์ด์ง€๋“ค์„ ๊ตฌ์„ฑํ•ด์„œ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ์ž‘๋™ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์›น ํŽ˜์ด์ง€์˜ URL์€ ๋ฌผ๋ก ์ด๊ณ  HTML ๋ฌธ์„œ ๋‚ด์˜ ๊ฐ์ข… ํƒœ๊ทธ๋‚˜ ๋งํฌ ๋“ฑ์ด ์žˆ์–ด์•ผ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ,

SPA๋Š” HTML์ด ๊ฑฐ์˜ ๋น„์–ด์žˆ์–ด์„œ ๊ฒ€์ƒ‰ ๋กœ๋ด‡์ด ์ถฉ๋ถ„ํ•œ ์ž๋ฃŒ๋ฅผ ์ˆ˜์ง‘ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

 

์™€์ด์–ดํ”„๋ ˆ์ž„

์™€์ด์–ด ํ”„๋ ˆ์ž„์ด๋ž€ ๋””์ž์ธ์„ ํ•˜๊ธฐ ์ „ ๋‹จ๊ณ„๋กœ ํŽ˜์ด์ง€์˜ ํ”„๋ ˆ์ž„์„ ์งœ๋Š” ์ž‘์—…์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ์ž๋“ค์€ ์ด๊ฒƒ์„ ํ†ตํ•ด ์›นํŽ˜์ด์ง€์˜ ์ปจ์…‰์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ ๋ชฉ์—…์€ PC๋‚˜ ๋ชจ๋ฐ”์ผ์˜ ํ”„๋ ˆ์ž„์— ๋งž๊ฒŒ ๋งŒ๋“ค์–ด ์ง๊ด€์ ์œผ๋กœ ์ดํ•ด๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ๋””์ž์ธํ•œ ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

์™€์ด์–ด ํ”„๋ ˆ์ž„์„ ๊ตฌ์ƒํ•  ๋•Œ๋Š” ๋จผ์ € ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค์–ด์„œ ์–ด๋–ป๊ฒŒ ์กฐํ•ฉํ• ์ง€๋ฅผ ๊ตฌ์ƒํ•ฉ๋‹ˆ๋‹ค.

EX) ์œ ํŠœ๋ธŒ๋Š” ํ—ค๋”, ์ปจํ…์ธ , ๊ทธ๋ฆฌ๊ณ  ์ปจํ…์ธ  ์•ˆ์— ์ธ๋„ค์ผ, ์กฐํšŒ์ˆ˜, ์—…๋กœ๋“œํ•œ ๋‚ ์งœ ๋“ฑ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„ UI์— ๋งž๊ฒŒ ํ™”๋ฉด์— ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

 

๋ผ์šฐํŒ…

๋ผ์šฐํŒ…(Routing)์€ "๊ฒฝ๋กœ์— ๋”ฐ๋ผ ๋ณ€๊ฒฝํ•œ๋‹ค"๋ผ๋Š” ์˜๋ฏธ๋ฅผ ๊ฐ–๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋‹ค๋ฅธ ์ฃผ์†Œ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๊ณผ์ •์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

 

React Router์˜ ์ฃผ์š” ์ปดํฌ๋„ŒํŠธ๋Š” ํฌ๊ฒŒ 3๊ฐ€์ง€๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ผ์šฐํ„ฐ ์—ญํ• ์„ ํ•˜๋Š” BrowserRouter, ๊ฒฝ๋กœ๋ฅผ ๋งค์นญํ•ด์ฃผ๋Š” Switch ์™€ Route, ๊ทธ๋ฆฌ๊ณ  ๊ฒฝ๋กœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์—ญํ• ์„ ํ•˜๋Š” Link ์ž…๋‹ˆ๋‹ค.

 

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

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

 

 

 

๊ทธ๋Ÿผ ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ๋ผ์šฐํŒ…์„ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

1. ๋จผ์ € ๋ผ์šฐํŒ…์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์„ค์ •ํ•ด์ค๋‹ˆ๋‹ค.

   ๋จผ์ € React Router DOM์„ ์„ค์น˜ํ•œ ํ›„, import๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๊ฐ€์ง€๊ณ  ์˜ต๋‹ˆ๋‹ค.

 

2. ๋ผ์šฐํŠธ์— ์‚ฌ์šฉ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž‘์„ฑํ•ด์ค๋‹ˆ๋‹ค.

   ์•„๋ž˜ ์˜ˆ์‹œ์—๋Š” Home, MyPage, Dashboard๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

3. ์œ„์˜ ์ปดํฌ๋„ŒํŠธ๋“ค์ด ๋ณด์—ฌ์งˆ ์ˆ˜ ์žˆ๋„๋ก ๋ฉ”๋‰ด๋ฅผ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค.

   <div>, <li> ๋“ฑ์„ ์ด์šฉํ•ด์„œ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

 

4. ๋ชจ๋“  ๊ฒƒ๋“ค์ด ์ค€๋น„๋์œผ๋‹ˆ ์ฃผ์†Œ์— ๋”ฐ๋ผ ํŽ˜์ด์ง€๊ฐ€ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•ด์ค๋‹ˆ๋‹ค.

   1) Route ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด <BrowserRouter>๋ฅผ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค.

   2) ์ฃผ์†Œ ๊ฒฝ๋กœ์™€ 2๋ฒˆ์—์„œ ๋งŒ๋“  ์ปดํฌ๋„ŒํŠธ๋“ค์„ ์—ฐ๊ฒฐํ•ด์ฃผ๊ธฐ ์œ„ํ•ด <Switch> ์™€ <Route>๋ฅผ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค.

   3) Link์˜ to๋ฅผ ์ด์šฉํ•ด์„œ ์ปดํฌ๋„ŒํŠธ์™€ path์ฃผ์†Œ๋ฅผ ์—ฐ๊ฒฐํ•ด์ค๋‹ˆ๋‹ค.

 

 

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

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


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

        <Switch>
          <Route exact path="/">
            <Home />
          </Route>
          <Route path="/about">
            <MyPage />
          </Route>
          <Route path="/dashboard">
            <Dashboard />
          </Route>
        </Switch>
      </div>
    </BrowserRouter>
  );
}

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

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

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

export default App;

 

 

Sprint Office Hour

window.history.back ๋˜๋Š” window.history.forward๋ฅผ ํ™œ์šฉํ•ด์„œ ๊ตฌํ˜„ ๊ฐ€๋Šฅ