[๐Ÿ’ป ์ฝ”๋“œ์Šคํ…Œ์ด์ธ  FE 44๊ธฐ] React SPA

JiEunยท2023๋…„ 3์›” 23์ผ
0
post-thumbnail

โœ”๏ธ ์‹œ์ž‘

React SPA๊ฐ€ ๋„์ž…๋œ ๋ฐฐ๊ฒฝ๊ณผ ์–ด๋–ป๊ฒŒ ์ง„ํ–‰๋˜๋Š”์ง€ ํ•™์Šตํ–ˆ๋‹ค.


๐Ÿ“์•Œ๊ฒŒ๋œ ๊ฒƒ

โœ”๏ธ SPA(Single Page Application)

๋“ฑ์žฅ ๋ฐฐ๊ฒฝ

  • ์˜ˆ์ „ ์›น ์‚ฌ์ดํŠธ๋Š” ํŽ˜์ด์ง€ ์ด๋™ ์‹œ ํŽ˜์ด์ง€ ์ „์ฒด๋ฅผ ๋ถˆ๋Ÿฌ ์™€์•ผํ–ˆ๋‹ค.
    ์ ์  ์ฆ๊ฐ€๋˜๋Š” ๋ฐ์ดํ„ฐ ๋“ฑ์œผ๋กœ ์ธํ•ด ํŠธ๋ž˜ํ”ฝ ์ฆ๊ฐ€์™€ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์˜ ์ €ํ•˜๊ฐ€ ์ƒ๊ธฐ๊ฒŒ ๋˜์—ˆ๊ณ  ์ด๋กœ ์ธํ•ด SPA๊ฐ€ ๋“ฑ์žฅํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.(ํŽ˜์ด์ง€ ์ „์ฒด๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ํ–‰์œ„ : ๊นœ๋นก์ธ๋‹ค.)

SPA ๋“ฑ์žฅ

  • HTML ๋ฌธ์„œ ์ „์ฒด๊ฐ€ ์•„๋‹Œ ์—…๋ฐ์ดํŠธ ์‹œ ํ•„์š”ํ•œ ์˜์—ญ๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„ ๊ทธ ์ •๋ณด๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•ด๋‹น ํŽ˜์ด์ง€๋ฅผ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.

- ์žฅ์ 

  • ์‚ฌ์šฉ์ž์™€์˜ ์ธํ„ฐ๋ ‰์…˜(Interaction)๊ฐ€ ๋น ๋ฅด๊ฒŒ ๋ฐ˜์‘ํ•œ๋‹ค.
  • ์„œ๋ฒ„ ๊ณผ๋ถ€ํ•˜ ๋ฌธ์ œ๊ฐ€ ์ค„์–ด๋“ ๋‹ค.
  • ์ „์ฒด ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋งํ•  ํ•„์š”๊ฐ€ ์—†์ด๊ฒŒ ๋” ๋‚˜์€ ์œ ์ € ๊ฒฝํ—˜์„ ์ œ๊ณตํ•œ๋‹ค.

Youtube, facebook, Gmail ๋“ฑ โžค SPA๋กœ ๋งŒ๋“ค์—ˆ๋‹ค.

์žฅ์ ์ด ์žˆ๋‹ค๋ฉด ๋‹จ์ ๋„ ์กด์žฌํ•œ๋‹ค.

- ๋‹จ์ 

  • Javascript ํŒŒ์ผ์ด ํฌ๋‹ค.
    - ๋Œ€๋ถ€๋ถ„์˜ ์ฝ”๋“œ๊ฐ€ Javacsript๋‚ด๋ถ€์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Javascript ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‹œ๊ฐ„์œผ๋กœ ์ฒซ ํ™”๋ฉด ๋กœ๋”ฉ์‹œ๊ฐ„์ด ๊ธธ์–ด์ง„๋‹ค.
  • ๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™”์— ์ข‹์ง€ ์•Š๋‹ค.
    - ๋Œ€๋ถ€๋ถ„์˜ ์ฝ”๋“œ๊ฐ€ Javascript์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— HTML ํŒŒ์ผ ๋‚ด๋ถ€์—๋Š” ๋ณ„๋‹ค๋ฅธ ์ •๋ณด๊ฐ€ ์—†๋‹ค.

โœ”๏ธ ๋ผ์šฐํŒ…(Routing)

  • ๋‹ค๋ฅธ ์ฃผ์†Œ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ํ™”๋ฉด์„ ๋ณด์—ฌ์ฃผ๋Š” ๊ณผ์ • (๊ฒฝ๋กœ์— ๋”ฐ๋ผ ๋ณ€๊ฒฝ)
  • ๋ผ์šฐํŒ…ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” React Router ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•ด์•ผํ•œ๋‹ค.

- Router ์ปดํฌ๋„ŒํŠธ ์„ค์น˜/ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

์„ค์น˜ํ•˜๊ธฐ

1.React App ์„ค์น˜

npx create-react-app ํŒŒ์ผ๋ช…
  1. npm install react-router-dom@๋ฒ„์ „
npm install react-router-dom@6.3.0

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

  • import : ํ•„์š”ํ•œ ๋ชจ๋“ˆ์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์—ญํ• ๋กœ ๋น„๊ตฌ์กฐํ™” ํ• ๋‹น(destructuring assignment)์™€ ๋น„์Šทํ•˜๊ฒŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
import { BrowserRouter, Routes, Route, Link} from 'react-router-dom';

์‹คํ–‰ํ™”๋ฉด ๋ณด๊ธฐ

npm run start

- ์ฃผ์š” ์ปดํฌ๋„ŒํŠธ

  • <Browser Router> : ๋ผ์šฐํ„ฐ ์—ญํ• (์ „์ฒด๋ฅผ ๊ฐ์‹ธ๊ณ  ์žˆ์–ด์•ผํ•œ๋‹ค.)
  • <Routes> : ์—ฌ๋Ÿฌ Route๋ฅผ ๊ฐ์‹ธ๊ณ  ๊ฒฝ๋กœ๊ฐ€ ์ผ์น˜ํ•˜๋ฉด ๋ Œ๋”๋ง ํ•œ๋‹ค. (๊ฒฝ๋กœ๋ฅผ ๋งค์นญ)
  • <Route> : path์†์„ฑ์„ ์ง€์ •ํ•ด path์—์„œ ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ณด์—ฌ์ค„์ง€ ์ •ํ•œ๋‹ค.
    - ๊ฒฝ๋กœ : path๋กœ ์—ฐ๊ฒฐ
    - ์ปดํฌ๋„ŒํŠธ : element๋กœ ์—ฐ๊ฒฐ
  • <Link> : ํŽ˜์ด์ง€ ์ „ํ™˜์„ ๋ฐฉ์ง€ํ•˜๊ธฐ์œ„ํ•ด to์†์„ฑ์„ ํ™œ์šฉํ•ด Route์— ์„ค์ •ํ•œ path ์ฃผ์†Œ์— ์—ฐ๊ฒฐํ•œ๋‹ค.
function App(){
	return(
    	<BrowserRouter>
        	<div>
              <nav>
              	<ul>
                	<li>
                     	 {/* Link ์ปดํฌ๋„ŒํŠธ ์ด์šฉํ•ด ๊ฒฝ๋กœ ์—ฐ๊ฒฐ */}
                  		<Link to="/">Home</Link>
                  	</li>
                  	<li>
                  		<Link to="/about">About</Link>
                  	</li>
                </ul>
              </nav>
              <Routes>
                <Route path="/" element={<Home />} /> 
                {/* ๊ฒฝ๋กœ๋Š” path๋กœ, ์ปดํฌ๋„ŒํŠธ๋Š” element๋กœ ์—ฐ๊ฒฐ */}
                <Route path="/about" element={<About />} /> 
              </Routes>
			</div>
        </BrowserRouter>
    )
}

function Home() {
  return <h1>Home</h1>;
}

function About() {
  return <h1>About</h1>;
}

export default App;

โœ”๏ธ useNavigate ์ด์šฉํ•œ ๋’ค๋กœ๊ฐ€๊ธฐ

  • useNavigate: ์–‘์‹์ด ์ œ์ถœ๋˜๊ฑฐ๋‚˜ ํŠน์ • event๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ url์„ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณต
{/*useNavigate ๋ถˆ๋Ÿฌ์˜ค๊ธฐ*/}
import { useNavigate } from 'react-router-dom';

function App(){
  {/*๋ณ€์ˆ˜ ํ• ๋‹น*/}
  const navigate = useNavigate();
  const backBtn = () => {
    navigate(-1)
  }
return (
	<Link onClick={backBtn}>Back</Link>
	<button onClick={backBtn}>Back</button>
)

}
export default App;

useNavigate(-1) ๋’ค๋กœ๊ฐ€๊ธฐ
useNavigate(1) ์•ž์œผ๋กœ๊ฐ€๊ธฐ


โœ๏ธ ๋งˆ์น˜๋ฉฐ

Router ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•ด SPA๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„์ด์˜€๋‹ค.
์•„์ง์€ ๋ฏธ์ˆ™ํ•˜์ง€๋งŒ React๊ฐ€ ์–ด๋–ค์‹์œผ๋กœ ์ž‘๋™๋˜๋Š”์ง€์˜ ๊ตฌ์กฐ๋ฅผ ๋‹ค์‹œ ํ•œ ๋ฒˆ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„์ด์˜€๋‹ค.

profile
๐Ÿ’ป ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ ๋ชฉํ‘œ๋กœ ์„ฑ์žฅ ์ค‘! (์•Œ์•„๋ดค๋˜ ๋‚ด์šฉ ๋“ฑ์„ ์ •๋ฆฌํ•˜๊ธฐ)

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