์ปดํฌ๋ํธ ๋๋๋ ๊ฒ์ ๋ํด ์ ๊ณ ๋ฏผ์ด ํ์ํ๊ฐ์??
โฅ ์ ํ๋ฆฌ์ผ์ด์ ์์์ ๋ค๋ค์ง๋ ๋ฐ์ดํฐ๋ฅผ ์ปดํฌ๋ํธ๋ค๋ผ๋ฆฌ ๋ณด๋ค ์ ๊ธฐ์ ์ผ๋ก ์ฃผ๊ณ ๋ฐ์ ์ ์๋๋ก ์ค๊ณํด์ผ ํ๊ธฐ ๋๋ฌธ์
React๋ฅผ ์ด์ฉํด ์ด๋ป๊ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค์ง ์ค๊ณ๋ฅผ ํ๋ค๋ฉด ํ์ด์ง๋ฅผ ๋ง๋ค๊ธฐ ์ ์, ์ด๋ค ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค๊ณ ์ด๋ค์ ์กฐํฉํ ์ง๋ถํฐ ๊ตฌ์ํ ๊ณํ์ ์ง์ผํ๋ค!!
<React Router ์ด์ฉํด์ React SPA(Single-Page Application) ๊ฐ๋ฐํ๊ธฐ>
SPA๋ ํ๋์ ํ์ด์ง๋ฅผ ๊ฐ์ง๊ณ ์์ง๋ง, ํ ์ข ๋ฅ์ ํ๋ฉด๋ง ์ฌ์ฉํ์ง ์๋๋ค.
WHY? ๐ค
ํ์ด์ง ์์ ๋ฒํผ์ ๋๋ฅด๋ฉด ๊ฐ ๋ฒํผ์ ๋ํ ํ์ด์ง ํ๋ฉด์ด ํ์ํ๋๊น!
๋ํ ์ด ํ๋ฉด์ ๋ฐ๋ผ '์ฃผ์'๋ ๋ฌ๋ผ์ง๋ค!
๋ผ์ฐํ (Routing) = ๋ค๋ฅธ ์ฃผ์์ ๋ฐ๋ผ ๋ค๋ฅธ ๋ทฐ๋ฅผ ๋ณด์ฌ์ฃผ๋ ๊ณผ์ / ๊ฒฝ๋ก์ ๋ฐ๋ผ ๋ณ๊ฒฝํ๋ค.
BUT๐ฌ
React ์์ฒด์๋ ์ด ๊ธฐ๋ฅ์ด ๋ด์ฅ๋์ด ์์ง ์๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๊ฐ ์ง์ ์ฃผ์๋ง๋ค ๋ค๋ฅธ ๋ทฐ๋ฅผ ๋ณด์ฌ์ค์ผํ๋ค.
๐ React SPA์์๋ ๋ผ์ฐํ ์ ์ํด React Router๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ค.
React Router์ ์ฃผ์ ์ปดํฌ๋ํธ
<BrowserRouter> = ๋ผ์ฐํฐ ์ญํ ์ ํ๋ค.
<Routes> = ๊ฒฝ๋ก๋ฅผ ๋งค์นญํด์ค๋ค.
<Route> = ๊ฒฝ๋ก๋ฅผ ๋งค์นญํด์ค๋ค.
<Link> = ๊ฒฝ๋ก๋ฅผ ๋ณ๊ฒฝํด์ค๋ค.
๐ ์ด ์ปดํฌ๋ํธ๋ค์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ React Router ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๋ฐ๋ก ๋ถ๋ฌ์์ผ ํ๋ค.
import{BrowserRouter,Routes,Route,Link} from "react-router-dom";
import๋ ํ์ํ ๋ชจ๋์ ๋ถ๋ฌ์ค๋ ์ญํ ์ ํ๋ค. (๋น๊ตฌ์กฐํ ํ ๋น(destructuring assignment)๊ณผ ๋น์ทํ๊ฒ ์ด์ฉํ ์ ์๋ค. )
React Router ์ฌ์ฉ ํ๊ฒฝ ์ธํ
1. react-router ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น
npx create-react-app simpleroute // simpleroute ํด๋์ React App ์ค์น
cd simpleroute
npm install react-router-dom@^6.3.0 // react-router ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น
2. App.js๋ก react-router ์ปดํฌ๋ํธ ๊บผ๋ด์ค๊ธฐ
import React from "react";
import{BrowserRouter,Routes,Route,Link} from "react-router-dom";
export default function App() {
return (...)
}
<์ฃผ์์ ๋ฐ๋ผ ํ์ด์ง ๋ทฐ ๋ค๋ฅด๊ฒ ๋ง๋ค๊ธฐ>
App.js ์ ๋ผ์ฐํ ์ ํ๊ธฐ ์ํ React Router์ ์ฃผ์ ์ปดํฌ๋ํธ๋ฅผ ์ธํ ํ๊ธฐ!
์ด ์ปดํฌ๋ํธ๋ฅผ ์ด์ฉํด์ ์ฐ๋ฆฌ๊ฐ ์ํ๋ "์ฃผ์์ ๋ฐ๋ฅธ ๋ค๋ฅธ ํ์ด์ง"๋ฅผ ๊ตฌํํ ์ ์๋ค.
BrowserRouter
<BrowserRouter> ์ปดํฌ๋ํธ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ HTML5์ History API๋ฅผ ์ฌ์ฉํด ํ์ด์ง๋ฅผ ์๋ก๊ณ ์นจํ์ง ์๊ณ ๋ ์ฃผ์๋ฅผ ๋ณ๊ฒฝํ ์ ์๊ฒ ํด์ค๋ค. ๋ํ <BrowserRouter> ๊ฐ ์์์ ์์ฑ๋์ด ์์ด์ผ React Router์ ์ปดํฌ๋ํธ๋ค์ ์ฌ์ฉํ ์ ์๋ค.
(tip)
๋ธ๋ผ์ฐ์ ๋ผ์ฐํฐ๋ react-router-dom ์์ ์๋ ๊ทธ ๋ฌด์๋ณด๋ค ์์๋ง ์์ผ๋ฉด ๋๋๊ฑฐ๋ค.
๐
ReactDOM์ ๋ ๋ ๋จ๊ณ์ธ index.js ์ <BrowserRouter>๋ฅผ ๋ฃ์ด์ ํ์ฉํ ์๋ ์๋ค.
๐์์ 1) index.js (React Version 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>
);
๐์์ 2) index.js (React Version 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 ์์ฑ์ผ๋ก ์ฐ๊ฒฐํ๊ณ ์ ํ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ฃ์ด์ค๋ค.
ํ : ๋ง์ฝ ์ฌ์ฉ์๊ฐ ์ง์ ๋ ์ฃผ์์ธ “/’, “/mypage”, “/dashboard” ์ด์ธ์ ์ฃผ์๋ก ์ ๊ทผํ๊ฒ ๋๋ฉด ์๋ํ ํ๋ฉด์ด ๋ณด์ด์ง ์์ ์ ์๋ค.
์ด๋ด ๋ path=”*” ์ผ๋ก ์ค์ ํ๋ฉด, ์ง์ ๋์ง ์์ ์ฃผ์๋ก ์ ๊ทผํ ์์๋ ์ด ์์ฑ์ด ์ค์ ๋์ด ์๋ ์ปดํฌ๋ํธ๋ฅผ ๋ณด์ฌ์ฃผ๊ฒ ๋๋ค.
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;
Link
๊ฒฝ๋ก๋ฅผ ์ฐ๊ฒฐํด ์ฃผ๋ ์ญํ ์ ํ๋ ์ปดํฌ๋ํธ์ด๋ค.
ํ์ด์ง ์ ํ์ ํตํด ํ์ด์ง๋ฅผ ์๋ก ๋ถ๋ฌ์ค์ง ์๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ทธ๋๋ก ์ ์งํ์ฌ HTML5 History API๋ฅผ ์ด์ฉํด ํ์ด์ง์ ์ฃผ์๋ง ๋ณ๊ฒฝํด์ค๋ค.
React Router์์ <a> ์์๊ฐ ์๋ <Link>๋ฅผ ์ฌ์ฉํ๋ ์ด์ ??
โฅ <a> ์์๋ ํ์ด์ง๋ฅผ ์ ํํ๋ ๊ณผ์ ์์ ํ์ด์ง๋ฅผ ๋ถ๋ฌ์ค๊ธฐ ๋๋ฌธ์ ๋ค์ ์ฒ์๋ถํฐ ๋ ๋๋ง์ ์ํจ๋ค. (์๋ก๊ณ ์นจ ํ์)
ํ์ง๋ง <Link> ์ปดํฌ๋ํธ๋ ํ์ด์ง ์ ํ์ ๋ฐฉ์งํ๋ ๊ธฐ๋ฅ์ด ๋ด์ฅ๋์ด ์๊ธฐ ๋๋ฌธ์ SPA๋ฅผ ๊ตฌํํ ์ ์๋ค.
- <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;
'๐ฅFrontEnd > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
TIL) ๋ฆฌ์กํธ ๊ธฐ์ด, export, import ํ๋ ๋ฐฉ๋ฒ (0) | 2022.06.12 |
---|---|
TIL) ๋ฆฌ์กํธ State & Props ์ดํดํ๊ธฐ (0) | 2022.06.08 |
TIL) ๋ฆฌ์กํธ SPA ์ฅ๋จ์ , ๊ฒ์ ์์ง์ ์๋ ๋ฐฉ์, SPA ์ฌ์ฉํ๋ ์ด์ (0) | 2022.06.03 |
TIL) ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ๊ฐ๋ฐ, ๋ฆฌ์กํธ ๊ธฐ์ด, Create React App์ด๋? ๋ฆฌ์กํธ ์คํํ๊ธฐ (0) | 2022.06.03 |
TIL) JSX๋? JSX ์ฐ๋ ์ด์ , JSX ๋ฌธ๋ฒ (0) | 2022.06.02 |