-
[React] SPA, RoutercodeStates 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;
์คํ ์ ๋งํฌ์ ๋ฐ๋ผ ํ์ด์ง๊ฐ ์ด๋ํฉ๋๋ค ๐
๋ฐ์ํ'codeStates front-end > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] ์ด๋ฒคํธ ์ฒ๋ฆฌ & Controlled Component & React ๋ฐ์ดํฐ ํ๋ฆ (0) 2023.01.26 [React] State & Props & ๋ ๋๋ง ์ ์ (0) 2023.01.25 [React] ์ค์ต - react twittler SPA (0) 2023.01.25 [React] ์ค์ต - react twittler (1) 2023.01.20 [React] JSX, Component (0) 2023.01.20