Jieunny์˜ ๋ธ”๋กœ๊ทธ

S2) Unit 5. [React] React SPA ๋ณธ๋ฌธ

CodeStates/learning contents

S2) Unit 5. [React] React SPA

Jieunny 2023. 1. 25. 11:30

๐Ÿ“ฃ SPA ๋ž€?

โœ”๏ธ ๋“ฑ์žฅ๋ฐฐ๊ฒฝ 

โžฐ ์ „ํ†ต์ ์ธ ์›น์‚ฌ์ดํŠธ : ์‚ฌ์šฉ์ž๊ฐ€ ์›น์‚ฌ์ดํŠธ ๋‚ด์˜ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๋ฉด, ๋งค๋ฒˆ HTML ํŒŒ์ผ๋กœ ๋œ ํŽ˜์ด์ง€ '์ „์ฒด'๋ฅผ ๋ถˆ๋Ÿฌ์™€์•ผ ํ–ˆ๋‹ค.

โžฐ ์ด๋•Œ๋งˆ๋‹ค header, navigation bar ๋“ฑ ์ค‘๋ณต๋˜๋Š” ์š”์†Œ๋“ค์„ ๋งค๋ฒˆ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ฒƒ์€ ์„œ์–ด์™€์˜ ๋ถˆํ•„์š”ํ•œ ํŠธ๋ž˜ํ”ฝ์„ ๋ฐœ์ƒ ์‹œ์ผฐ๋‹ค.

โžฐ ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„œ๋Š” ๋Š๋ฆฐ ๋ฐ˜์‘์„ฑ์„ ๊ฐ–๊ฒŒ ๋˜์—ˆ๋‹ค.

 

โœ”๏ธ SPA?

โžฐ Single Page Application

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

 

โœ”๏ธ ์žฅ์ 

โžฐ ๋ถ€๋ถ„ ๋ฐ์ดํ„ฐ๋งŒ ๋ฐ›์•„์„œ ํ™”๋ฉด์„ ์—…๋ฐ์ดํŠธ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ž์˜ ํ–‰๋™์— ๋น ๋ฅด๊ฒŒ ๋ฐ˜์‘ํ•œ๋‹ค.

โžฐ ์„œ๋ฒ„์—์„œ๋Š” ์š”์ฒญ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋งŒ ๋„˜๊ฒจ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„ ๊ณผ๋ถ€ํ•˜ ๋ฌธ์ œ๊ฐ€ ์ค„์–ด๋“ ๋‹ค.

โžฐ ์ „์ฒด ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋ง ํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋” ๋‚˜์€ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ œ๊ณตํ•œ๋‹ค.

 

โœ”๏ธ ๋‹จ์ 

โžฐ JS ํŒŒ์ผ์˜ ํฌ๊ธฐ๊ฐ€ ํฌ๊ธฐ ๋•Œ๋ฌธ์— ์ด JS ํŒŒ์ผ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‹œ๊ฐ„์œผ๋กœ ์ธํ•ด ์ฒซ ๋กœ๋”ฉ ์‹œ๊ฐ„์ด ๊ธธ๋‹ค.

โžฐ ๊ฒ€์ƒ‰ ๋กœ๋ด‡์€ ์ž๋ฃŒ๋ฅผ ์ˆ˜์ง‘ํ•  ๋•Œ HTML ์ž๋ฃŒ๋ฅผ ๋ถ„์„ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์„ ๊ตฌ๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์— HTML ํŒŒ์ผ์— ๋ณ„๋‹ค๋ฅธ ์ž๋ฃŒ๊ฐ€ ์—†๋Š” SPA์˜ ๊ฒฝ์šฐ ๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™”๊ฐ€ ์ข‹์ง€ ๋ชปํ•˜๋‹ค.

 

๐Ÿ“ฃ  Wireframe

โœ”๏ธ Wireframe vs Mockup

Wireframe  Mockup
์›นํŽ˜์ด์ง€์˜ ๋ ˆ์ด์•„์›ƒ๊ณผ UI ์š”์†Œ
๋“ฑ์— ๋Œ€ํ•œ ๋ผˆ๋Œ€(๋””์ž์ธX)
๋ฐ๋ชจ ์‹œ์—ฐ, ํ‰๊ฐ€๋ฅผ ์œ„ํ•œ ์ตœ์†Œํ•œ์˜
๊ธฐ๋Šฅ๋งŒ ๋‹ด์€ ๋ชจํ˜•(๋””์ž์ธO)

 

โœ”๏ธ React๋ฅผ ์ด์šฉํ•œ ์„ค๊ณ„

โžฐ ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค๊ณ , ์ด๋“ค์„ ์กฐํ•ฉํ• ์ง€ ๊ณ„ํšํ•˜๋Š”๊ฒŒ ์šฐ์„ 

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

 

 

๐Ÿ“ฃ  React Router

โœ”๏ธ React Router๋ž€?

โžฐ SPA๋Š” ํ•˜๋‚˜์˜ ํŽ˜์ด์ง€๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ ํ•œ ์ข…๋ฅ˜์˜ ํ™”๋ฉด๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฑด ์•„๋‹ˆ๋‹ค.
โžฐ ํ™”๋ฉด์— ๋”ฐ๋ผ ์ฃผ์†Œ๊ฐ€ ๋‹ฌ๋ผ์ง€๋Š” ๊ฒƒ 
โžฐ ๋‹ค๋ฅธ ์ฃผ์†Œ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋ทฐ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๊ณผ์ • : Routing
โžฐ ๋ฆฌ์•กํŠธ์— ๊ธฐ๋Šฅ์ด ๋‚ด์žฅ๋˜์–ด ์žˆ์ง€ ์•Š์•„์„œ React Router๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ

 

โœ”๏ธ React Router ํ™œ์šฉ

โžฐ ์ฃผ์š” ์ปดํฌ๋„ŒํŠธ

1๏ธโƒฃ BrowserRouter : ๋ผ์šฐํ„ฐ ์—ญํ• 

2๏ธโƒฃ Routes, Route : ๊ฒฝ๋กœ๋ฅผ ๋งค์นญ

3๏ธโƒฃ Link : ๊ฒฝ๋กœ๋ฅผ ๋ณ€๊ฒฝ

 

โžฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜

npm install react-router-dom@^6.3.0

 

โžฐ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

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

 

๐Ÿ“ฃ  React Router ์‹ค์Šต

โœ”๏ธ <BrowserRouter> : ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ๊ณ ์นจํ•˜์ง€ ์•Š๊ณ ๋„ ์ฃผ์†Œ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

โžฐ BrowserRouter๊ฐ€ ์ƒ์œ„์— ์ž‘์„ฑ๋˜์–ด ์žˆ์–ด์•ผ React Router์˜ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

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

โžฐ <Routes>๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ๋งค์นญ๋˜๋Š” ๋ชจ๋“  ์š”์†Œ๋ฅผ ๋ Œ๋”๋งํ•œ๋‹ค.

 

โœ”๏ธ <Route> : path์†์„ฑ์„ ์ง€์ •ํ•ด์„œ ํ•ด๋‹น path์—์„œ ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ณด์—ฌ์ค„์ง€ ์ •ํ•œ๋‹ค.

โžฐ <Link> ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ •ํ•ด์ฃผ๋Š” URL ๊ฒฝ๋กœ์™€ ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ž‘๋™๋œ๋‹ค.

 

๐Ÿšจ ์‚ฌ์šฉ์ž๊ฐ€ ์ง€์ •๋œ ์ฃผ์†Œ ์ด์™ธ์˜ ์ฃผ์†Œ๋กœ ์ ‘๊ทผํ•˜๊ฒŒ ๋˜๋ฉด ์˜๋„ํ•œ ํ™”๋ฉด์ด ๋ณด์ด์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค.

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

 

โœ”๏ธ <Link> : ๊ฒฝ๋กœ๋ฅผ ์—ฐ๊ฒฐํ•ด ์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

โžฐ ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ ๋ถˆ๋Ÿฌ์˜ค์ง€ ์•Š๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜์—ฌ ํŽ˜์ด์ง€์˜ ์ฃผ์†Œ๋งŒ ๋ณ€๊ฒฝํ•ด ์ค€๋‹ค.

โžฐ ReactDOM์œผ๋กœ ๋ Œ๋”๋ฅผ ์‹œํ‚ค๋ฉด <Link> ๊ฐ€ <a> ์š”์†Œ๋กœ ๋ฐ”๋€Œ๋Š” ๋ชจ์Šต์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

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

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

 

import logo from './logo.svg';
import './App.css';
import React from 'react';
import { BrowserRouter, Routes, Route, Link } from 'react-router-dom';

function App() {
  return (
    <BrowserRouter>
      <div>
        <nav>
          <ul>
            <li>
            <Link to="/">Home</Link>
            </li>
            <li>
            <Link to="/mypage">MyPage</Link>
            </li>
            <li>
            <Link to="/dashboard">Dashboard</Link>
            </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>
  );
}

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

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

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

export default App;

 

 

'CodeStates > learning contents' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

S2) Unit 7. [HTTP/๋„คํŠธ์›Œํฌ] HTTP  (0) 2023.01.30
S2) Unit 6. [React] React State & Props  (2) 2023.01.26
S2) Unit 4. [React] ๊ธฐ์ดˆ  (0) 2023.01.20
S2) Unit 3. [JS] fetch & Axios  (0) 2023.01.19
S2) Unit 3. [JS] Node.js  (0) 2023.01.18