SPA๋ ํ๋์ ํ์ด์ง๋ฅผ ๊ฐ์ง๊ณ ์์ง๋ง ์ฌ๋ฌ ์ข ๋ฅ์ ํ๋ฉด์ ์ฌ์ฉํ๋ค.
์๋๋ Twittler์ ์์์ด๋ฉฐ, ํ๋์ ํ์ด์ง๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ ๋ฉ์ธ ํธ์ ๋ชจ์ ํ์ด์ง, ์๋ฆผ ํ์ด์ง, ๋ง์ด ํธ์ ํ์ด์ง ๋ฑ์ ํ๋ฉด์ ํ์๋ก ํ๊ณ ์๋ ๊ฒ์ ์ ์ ์๋ค.
๊ฐ ํ๋ฉด์ ๋ฐ๋ผ ์ฃผ์๋ ๋ฌ๋ผ์ง๋๋ฐ, ์ด๋ ๊ฒ ๋ค๋ฅธ ์ฃผ์์ ๋ฐ๋ผ ๋ค๋ฅธ ๋ทฐ๋ฅผ ๋ณด์ฌ์ฃผ๋ ๊ณผ์ ์ Routing์ด๋ผ๊ณ ํ๋ค. ( Routing: ๊ฒฝ๋ก์ ๋ฐ๋ผ ๋ณ๊ฒฝํ๋ค. )
๊ทธ๋ฌ๋, React ์์ฒด์ ๋ผ์ฐํ ๊ธฐ๋ฅ์ด ๋ด์ฅ๋์ด ์์ง ์๊ธฐ ๋๋ฌธ์ ์ง์ ์ฃผ์๋ง๋ค ๋ค๋ฅธ ๋ทฐ๋ฅผ ๋ณด์ฌ์ค์ผํ๋ค.
์ด ๋, React Router ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ค.
React Router์ ์ฃผ์ ์ปดํฌ๋ํธ๋ ํฌ๊ฒ 3๊ฐ์ง๋ก ๋๋ ์ ์์ผ๋ฉฐ, ์๋์ ๊ฐ์ด ๊ตฌ์ฑ๋๋ค.
import { BrowserRouter, Routes, Route, Link } from "react-router-dom"
1) React router ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น
ํฐ๋ฏธ๋์ npx create-react-app <ํ๋ก์ ํธ ํด๋ ๋ช
>
๋ช
๋ น์ด๋ฅผ ์
๋ ฅํด React ํ๋ก์ ํธ ํ๊ฒฝ์ ๋ง๋ ํ,
npm install react-router-dom@^6.3.0
๋ช
๋ น์ด๋ฅผ ์
๋ ฅํด React-router ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํ๋ค.
2) App.js๋ก React-router ์ปดํฌ๋ํธ ๊บผ๋ด์ค๊ธฐ
App.js ํ์ผ ์ต์๋จ์ import { BrowserRouter, Routes, Route, Link } from "react-router-dom"
๊ตฌ๋ฌธ์ ์์ฑํด react-router ์ปดํฌ๋ํธ๋ฅผ ๋ถ๋ฌ์จ๋ค.
1 ) React router ์ฌ์ฉ ํ๊ฒฝ ์
ํ
ํ, package.json
ํ์ผ์ dependencies
ํญ๋ชฉ์ react-router-dom
๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ฑ๋ก ๋๋์ง ํ์ธ.
2 ) App.js ์ตํ๋จ์ ํ์ด์ง๋ฅผ ํ์ํ๋ ์ปดํฌ๋ํธ ์์ฑ
3 ) ๊ฐ ์ปดํฌ๋ํธ๋ก ์ด๋ํ ๋ฉ๋ด ์ ์: <ul>
, <li>
์์ ์ด์ฉ
4 ) ์ฃผ์์ ๋ฐ๋ผ ํ์ด์ง ๋ทฐ ๋ค๋ฅด๊ฒ ๋ง๋ค๊ธฐ
Home ํ์ด์ง์ ์ฃผ์ "/"
MyPage ํ์ด์ง์ ์ฃผ์ "/mypage"
Dashboard ํ์ด์ง์ ์ฃผ์ "/dashboard"
<BrowserRouter>
์ปดํฌ๋ํธ๋ ์น ์ ํ๋ฆฌ์ผ์ด์
์์ HTML5์ History API๋ฅผ ์ฌ์ฉํด ํ์ด์ง๋ฅผ ์๋ก๊ณ ์นจํ์ง ์๊ณ ๋ ์ฃผ์๋ฅผ ๋ณ๊ฒฝํ ์ ์๊ฒ ํด์ค๋ค.
๋ํ <BrowserRouter>
๊ฐ ์์์ ์์ฑ๋์ด ์์ด์ผ React Router์ ์ปดํฌ๋ํธ๋ค์ ์ฌ์ฉํ ์ ์๋ค.
์๋์ ๊ฐ์ด ReactDOM์ ๋ ๋ ๋จ๊ณ์ธ index.js
์๋ ํ์ฉํ ์ ์๋ค.
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>
);
๊ฒฝ๋ก๋ฅผ ๋งค์นญํด์ฃผ๋ ์ญํ ์ ํ๋ ์ปดํฌ๋ํธ์ด๋ค.
<Routes>
<Route>
์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ธ์ ๊ทธ์ค ๊ฒฝ๋ก๊ฐ ์ผ์นํ๋ ๋จ ํ๋์ ๋ผ์ฐํฐ๋ง ๋ ๋๋ง์ ์์ผ์ฃผ๋ ์ญํ ์ ํ๋ค.
<Routes>
๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด ๋งค์นญ๋๋ ๋ชจ๋ ์์๋ฅผ ๋ ๋๋งํฉ๋๋ค.
<Route>
path ์์ฑ์ ์ง์ ํ์ฌ ํด๋น path ์์ ์ด๋ค ์ปดํฌ๋ํธ๋ฅผ ๋ณด์ฌ์ค์ง ์ ํ๋ค.
<Link>
์ปดํฌ๋ํธ๊ฐ ์ ํด์ฃผ๋ URL ๊ฒฝ๋ก์ ์ผ์นํ๋ ๊ฒฝ์ฐ์๋ง ์๋ํ๋ค.
<Routes>
์ <Route>
๋ก ์ฃผ์ ๊ฒฝ๋ก์ ์ปดํฌ๋ํธ๋ฅผ ์ฐ๊ฒฐํด ์ค๋ค.<Route>
์ path ์์ฑ์ ์ด์ฉํ์ฌ ๊ฒฝ๋ก๋ฅผ ์์ฑํ๋ค.<Route>
ํ๊ทธ ์์ element ์์ฑ์ผ๋ก ์ฐ๊ฒฐํ๊ณ ์ ํ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ฃ์ด์ค๋ค.๊ฒฝ๋ก๋ฅผ ์ฐ๊ฒฐํด ์ฃผ๋ ์ญํ ์ ํ๋ ์ปดํฌ๋ํธ๋ก, ํ์ด์ง ์ ํ์ ํตํด ํ์ด์ง๋ฅผ ์๋ก ๋ถ๋ฌ์ค์ง ์๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ทธ๋๋ก ์ ์งํ์ฌ HTML5 History API๋ฅผ ์ด์ฉํด ํ์ด์ง์ ์ฃผ์๋ง ๋ณ๊ฒฝํด ์ค๋ค.
ReactDOM์ผ๋ก ๋ ๋๋ฅผ ์ํค๊ฒ ๋๋ฉด <Link>
์ปดํฌ๋ํธ๊ฐ <a>
์์๋ก ๋ฐ๋๋ ๋ชจ์ต์ ๋ณผ ์ ์๋ค.
<a>
์์๋ ํ์ด์ง๋ฅผ ์ ํํ๋ ๊ณผ์ ์์ ํ์ด์ง๋ฅผ ๋ถ๋ฌ์ค๊ธฐ ๋๋ฌธ์ ๋ค์ ์ฒ์๋ถํฐ ๋ ๋๋ง(์๋ก๊ณ ์นจ ๋ฐ์)์ ์ํค๊ธฐ ๋๋ฌธ์ React Router์์๋ <Link>
๋ฅผ ์ฌ์ฉํ๋ค.
<Link>
์ปดํฌ๋ํธ๋ ํ์ด์ง ์ ํ์ ๋ฐฉ์งํ๋ ๊ธฐ๋ฅ์ด ๋ด์ฅ๋์ด ์๊ธฐ ๋๋ฌธ์ SPA๋ฅผ ๊ตฌํํ ์ ์๋ค.
<Link>
์ to
์์ฑ์ ํ์ฉํ์ฌ <Route>
์ปดํฌ๋ํธ์ ์ค์ ํด ์ค path ์ฃผ์๋ฅผ ์ฐ๊ฒฐํ๋ค.import logo from './logo.svg';
import './App.css';
import { BrowserRouter, Routes, Route, Link } from "react-router-dom"; // ์ด ๊ตฌ๋ฌธ์ ๋ฃ์ด์ฃผ์ธ์
function App () {
return (
// BrowserRouter๊ฐ ๊ฐ์ฅ ์์์ ์์ด์ผ ์ฌ์ฉ๊ฐ๋ฅ
<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>
)
}
export default App;
// Home ์ปดํฌ๋ํธ
function Home() {
return <h1>Home</h1>;
}
// MyPage ์ปดํฌ๋ํธ
function MyPage() {
return <h1>MyPage</h1>;
}
// Dashboard ์ปดํฌ๋ํธ
function Dashboard() {
return <h1>Dashboard</h1>;
}
Reference: ์ฝ๋์คํ ์ด์ธ