React SPA

jeongjwonยท2023๋…„ 3์›” 23์ผ
0

SEB FE

๋ชฉ๋ก ๋ณด๊ธฐ
26/56

๐Ÿ“Œ React SPA


์ „ํ†ต์ ์ธ ์›นํŽ˜์ด์ง€ (Multiple Page Application)

โœ… ์ „ํ†ต์ ์œผ๋กœ ํŽ˜์ด์ง€ ์ด๋™ ์‹œ ๋ธŒ๋Ÿฌ์šฐ์ €๊ฐ€ ๋งค๋ฒˆ HTMLํŒŒ์ผ๋กœ ๋œ ํŽ˜์ด์ง€ ์ „์ฒด ๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ–ˆ์Œ.

โžก๏ธ ์ค‘๋ณต๋˜๋Š” ์š”์†Œ๋“ค์„ ๋งค๋ฒˆ ๋ถˆ๋Ÿฌ์™€ ์„œ๋ฒ„์™€์˜ ๋ถˆํ•„์š”ํ•œ ํŠธ๋ž˜ํ”ฝ ๋ฐœ์ƒ
โžก๏ธ ๋Š๋ฆฐ ๋ฐ˜์‘์„ฑ , ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ €ํ•˜


SPA (Single Page Application)

โœ… 1990๋…„ ํ›„๋ฐ˜๋ถ€ํ„ฐ ํŽ˜์ด์ง€ ์ „ํ™˜ ์ „ํ›„์— ์ค‘๋ณต๋˜๋Š” ๋ถ€๋ถ„์€ ์ƒˆ๋กœ ๋ถˆ๋Ÿฌ์˜ค์ง€ ์•Š๊ณ  **์—…๋ฐ์ดํŠธ์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ์„œ๋ฒ„์—์„œ ์ „๋‹ฌ๋ฐ›์•„** ์ด ๋ฐ์ดํ„ฐ๋ฅผ JavaScript ๊ฐ€ ๋™์ ์œผ๋กœ HTML ์š”์†Œ๋ฅผ ์ƒ์„ฑํ•ด์„œ ํ™”๋ฉด์— ๋ณด์—ฌ์ฃผ๋Š” ๋ฐฉ์‹(JavaScript ์˜์กด์ )์ด ๊ฐœ๋ฐœ๋˜์—ˆ๊ณ , 2000๋…„๋Œ€ ์ค‘๋ฐ˜๋ถ€ํ„ฐ ๋ณดํŽธํ™”๋จ

โžก๏ธ ๋น ๋ฅธ ์‚ฌ์šฉ์ž์™€์˜ Interaction
โžก๏ธ ์„œ๋ฒ„์—์„œ๋Š” ์š”์ฒญ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋งŒ ๋„˜๊ฒจ์ฃผ๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„ ๊ณผ๋ถ€ํ•˜ ๋ฌธ์ œ ํ˜„์ €ํžˆ ๊ฐ์†Œ
โžก๏ธ ์ „์ฒด ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋ง ํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋” ๋‚˜์€ ์œ ์ € ๊ฒฝํ—˜

โžก๏ธ ์ฒซ ๋กœ๋”ฉ ์‹œ HTML ํŒŒ์ผ์„ ์ฝ์–ด๋“ค์ธ ํ›„ ๊ทธ ์•ˆ script ์š”์†Œ ์•ˆ์˜ JavaScript ๋ฐ›์•„์˜ค๋Š” ๊ณผ์ •์„ ๊ฑฐ์น˜๊ธฐ ๋•Œ๋ฌธ์— JavaScript ํŒŒ์ผ์˜ ํฌ๊ธฐ๊ฐ€ ํฌ๊ณ  ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‹œ๊ฐ„์œผ๋กœ ์ฒซ ํ™”๋ฉด์˜ ๋กœ๋”ฉ ์‹œ๊ฐ„์ด ๊ธธ์–ด์ง
โžก๏ธ ์ข‹์ง€ ์•Š์€ ๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™” ( ๊ฒ€์ƒ‰ ์—”์ง„์€ ๊ฒ€์ƒ‰ ๋กœ๋ด‡์ด ์›น ํŽ˜์ด์ง€ HTML ์— ์žˆ๋Š” ์ •๋ณด๋ฅผ ์ˆ˜์ง‘, ๋ถ„์„ํ•ด์„œ ๊ทธ ๊ฒฐ๊ณผ๊ฐ’์— ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ๋ณด๊ด€ํ•ด์žˆ๋‹ค๊ฐ€ ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒ€์ƒ‰์–ด๋ฅผ ์ž…๋ ฅ์‹œ ๋ณด๊ด€ํ•˜๊ณ  ์žˆ๋˜ ์ธ๋ฑ์Šค์—์„œ ๊ฒ€์ƒ‰์–ด์™€ ๊ฐ€์žฅ ์—ฐ๊ด€์„ฑ์ด ๋†’์€ ์›น ํŽ˜์ด์ง€๋“ค์„ ์ˆœ์„œ๋Œ€๋กœ ๋ณด์—ฌ์ฃผ๋Š” ๋ฐฉ์‹. ๊ทธ๋ ‡์ง€๋งŒ SPA ๋Š” HTML ์ด ๊ฑฐ์˜ ๋น„์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฒ€์ƒ‰ ๋กœ๋ด‡์ด ์ถฉ๋ถ„ํ•œ ์ž๋ฃŒ์ˆ˜์ง‘์„ ํ•˜์ง€ ๋ชปํ•œ๋‹ค. )


Wireframe

โœ… ๋””์ž์ธ์— ๋“ค์–ด๊ฐ€๊ธฐ ์ „ ๋‹จ๊ณ„๋กœ ์„ (wire)๋ฅผ ์ด์šฉํ•ด ์œค๊ณฝ์„ (frame)์„ ์žก๋Š” ๊ฒƒ. ์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” ๋””์ž์ธ ์ปจ์…‰๊ณผ ์‚ฌ์ดํŠธ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Œ. (๋ชฉ์—… Mockup ์€ ํ”„๋ ˆ์ž„์„ ์”Œ์›Œ ์ง๊ด€์ ์œผ๋กœ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋””์ž์ธํ•œ ๊ฒƒ)
โžก๏ธ ๊ฐœ๋ฐœ ์ „ ์ปดํฌ๋„ŒํŠธ๋ผ๋ฆฌ์˜ ์œ ๊ธฐ์ ์ธ ๊ธฐ๋Šฅ์„ ์„ค๊ณ„ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ์™€ ์ „์ฒด UI ๋ฅผ ๊ตฌ์ƒํ•˜๋Š”๋ฐ ํฐ ํ‹€



๐Ÿ“Œ React Router

โœ… SPA๋ฅผ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ํ™”๋ฉด์ด ๊ตฌ์„ฑ๋˜์–ด ์žˆ๊ณ , ๊ฐ๊ฐ์˜ ํ™”๋ฉด์€ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง„๋‹ค. ์ด๋ ‡๊ฒŒ ๋‹ค๋ฅธ ์ฃผ์†Œ/๊ฒฝ๋กœ/๋ผ์šฐํŒ…์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋ทฐ๋ฅผ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ๊ฒฝ๋กœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ผ์šฐํŒ…(Routing) ์„ ์œ„ํ•ด React Router ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
npm install react-router-dom : react router dom ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๊ฒฝ๋กœ๋งˆ๋‹ค ํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•˜๋Š”๋ฐ ๋„์›€์„ ์ฃผ๊ฒŒ ๋œ๋‹ค.

routerroute matchersroute changers
<BrowerRouter><Routes>, <Route><Link>
History AP๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ UI๋ฅผ URL๊ณผ ๋™๊ธฐํ™”๋œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•ด์ฃผ๋Š” ์—ญํ• Routes : Route๋กœ ์ƒ์„ฑ๋œ ์ž์‹ ์ปดํฌ๋„ŒํŠธ ์ค‘์—์„œ ๋งค์นญ๋˜๋Š” ์ฒซ๋ฒˆ์งธ Route ๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ์—ญํ•  / Route : ๊ฒฝ๋กœ๋ฅผ ์ง€์ •์‚ฌ์šฉ์ž๋ฅผ ์›ํ•˜๋Š” ๊ฒฝ๋กœ๋กœ ์ด๋™์‹œ์ผœ์ฃผ๋Š” ์—ญํ• 
  1. // simpleroute ํด๋”์— React app ์„ค์น˜
    npm create-react-app simpleroute
    cd simpleroute
    
    // react-router ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜
    npm install react-router-dom@^6.3.0
  2. //APP.js ๋กœ react-router ์ปดํฌ๋„ŒํŠธ ๊บผ๋‚ด์˜ค๊ธฐ
    import React from "react";
    import {BrowserRouter, Routes, Route, Link} from "react-router-dom";
    
    export default function App(){
    	return (
      	<div>
      		<BrowserRouter>
              	
                  <Routes>
                  	<Route path="/" elements={<Home />}></Route>
                  <Routes>
              </BrowserRouter>
          </div>
      );
    };
    
    
    //Home.js
    
    function Home() {
    	return(
      	<div>
          	<Link to="/"> </Link>
          </div>
      );
    };
  • ํ•„์š”ํ•œ ๋ชจ๋“ˆ์„ ๋ถˆ๋Ÿฌ์™€ ๋น„๊ตฌ์กฐํ™” ํ• ๋‹น๊ณผ ๋น„์Šทํ•˜๊ฒŒ ์ด์šฉํ•˜๋Š” import ์‚ฌ์šฉ
  • <Route> ์ปดํฌ๋„ŒํŠธ๋Š” <Routes> ์˜ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋˜์–ด์•ผ ํ•œ๋‹ค.
  • <Link> ์ปดํฌ๋„ŒํŠธ๋ฅผ ํด๋ฆญํ•˜๋ฉด <Link> ์˜ to ์†์„ฑ๊ณผ <Route> ์ปดํฌ๋„ŒํŠธ์˜ path ์†์„ฑ๊ณผ ์ผ์น˜ํ•˜๋Š” ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•œ๋‹ค. (๊ณ ๋กœ ๋‘˜์˜ ์†์„ฑ๊ฐ’์„ ์ผ์น˜์‹œ์ผœ์ฃผ์–ด์•ผ ํ•œ๋‹ค.)
  • <Route> ์˜ path="*" ๋กœ ์„ค์ •ํ•˜๋ฉด ์ •์˜ํ•˜์ง€ ์•Š์€ ๊ฒฝ๋กœ๋ฅผ ํ•ธ๋“ค๋งํ•  ์ˆ˜ ์žˆ๋‹ค.

ํŠน์ • ํ–‰๋™ ์ˆ˜ํ–‰์‹œ ํ•ด๋‹น ์ฃผ์†Œ ํŽ˜์ด์ง€, ์ด์ „ ํŽ˜์ด์ง€, ๋‹ค์ŒํŽ˜์ด์ง€๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.
useNavigate ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•˜๋ฏ€๋กœ

import {useNavigate} from "react-router-dom";

function Redirect() {
  let navigate = useNavigate();
  
  function handleClick() {
    navigate('/home');// /home url ๋กœ ์ด๋™
    navigate(-1);// ์ด์ „ ํŽ˜์ด์ง€๋กœ ์ด๋™
    navigate(1); // ๋‹ค์Œ ํŽ˜์ด์ง€๋กœ ์ด๋™
  }
  return (
    <div>
      <button onClick={handleClick}>go home</button>
    </div>
  );
}

0๊ฐœ์˜ ๋Œ“๊ธ€