์ด ๊ธ์ ๋ฆฌ์กํธ์ ์ด์ฌ์๋ค์ ์ํ ๊ธ๋ก ๊น์ ๋ด์ฉ์ ์ต๋ํ ๋ฐฐ์ ํ๊ณ ์ฌ์ด ๊ฐ๋ ์ ๋ํด ์์ฑํ์๊ณ , ๋ฆฌ์กํธ์ ์ง์ ์ฅ๋ฒ ์ ๋ฎ์ถ๊ธฐ ์ํ ์์๋ก ์ด๋ ค์ด ๋ด์ฉ์ด ์๋ต๋์ด ์์ ์๋ ์์ต๋๋ค.
์ด ๋ถ๋ถ์ ๊ฝค๋ ํต์ฌ์ ์ด๋ผ๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ 3๋ถ์์ผ๋ก ๋๋ ์ ์ค๋ช ํด๋ณด๋๋ก ํ๊ฒ ๋ค. ํด๋น ๊ธ์ ๋ํด์ ๋ณธ์ธ์ด ์ด ๋ถ๋ถ์ ๋์ด๊ฐ๋ ๋๊ฒ ๋ค๊ณ ์๊ฐํ๋ ๋ถ๋ถ์ ๋์ด๊ฐ์ ํ์ธํ๋ ๊ฒ์ ๊ถ์ฅํ๋ค. ํ์ง๋ง ๊ธธ์ง ์์ ๊ธ์ด๋ฏ๋ก ๊ฐ๋ณ๊ฒ ์ฝ๋ ๊ฒ๋ ์ข์ ๋ฐฉ๋ฒ์ด๋ค.
- 1๋ถ ๋ฆฌ์กํธ๊ฐ ํ์ด์ง๋ฅผ ๋ผ์ฐํ ํ๋ ๋ฐฉ๋ฒ
- 2๋ถ Browser History API๋ฅผ ์ฌ์ฉํด์ ํ์ด์ง ๋ผ์ฐํ ํ๊ธฐ
- 3๋ถ react-router-dom์ ์ด์ฉํด์ ํ์ด์ง ๋ผ์ฐํ ํ๊ธฐ
์ฐ๋ฆฐ ์ง๋ ์๊ฐ์ Brower Histroty API๋ฅผ ํตํด์ ํ์ด์ง๋ฅผ ์๋ฒ์ ์์ฒญ ์์ด ๋ผ์ฐํ ํ๋ ๋ฐฉ๋ฒ์ ๋ํด์ ์์๋ณด์๋ค.
์ค๋์ react-router-dom
์ ์ด์ฉํด์ ํ์ด์ง๋ฅผ ๋ผ์ฐํ
ํด๋ณด๋ ค๊ณ ํ๋ค.
์ง๋ ์๊ฐ์๋ Browser History API์ react-router-dom์ ๊ฐ๊ฐ ๋ค๋ฅธ ๋๋์ผ๋ก ์ค๋ช ํ์์ง๋ง ์ฌ์ค ์ ํํ ๋ง ํ์๋ฉด react-router-dom์ Browser History API๋ฅผ ๋ด๋ถ์ ์ผ๋ก ์ด์ฉํ๊ณ ์๋ค๊ณ ํ๋ ๊ฒ์ด ์ฌ๋ฐ๋ฅธ ํํ์ด๋ค.
๋ณธ๊ฒฉ์ ์ธ ์์์ ์์ ๋จผ์ ์ฐ๋ฆฌ๊ฐ ๋ง๋ค ํ์ด์ง์ ๋ํด์ ์์๋ณด์.
์ด๋ฐ ๊ฐ๋จํ ํ์ด์ง๋ฅผ ๋ง๋ค์ด๋ณด์.
react-router-dom
react-router-dom
์ Hook-Based API ๋ผ๊ณ ๊ณต์ ํํ์ด์ง์ ๋ช
์๋์ด ์๋ค.
Hook์ด๋?
hook์ ๋ค์์ ๋ ์์ธํ ๋ฐฐ์ฐ๊ฒ ๋ ๊ฒ์ด์ง๋ง
class ๋ฅผ ์์ฑํ ํ์ ์์ด ์ํ๊ฐ๊ณผ react ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๊ฒ ํ๋ค๋ ๊ฒ๋ง ์์๋๋ฉด ๋ ๊ฒ ๊ฐ๋ค.
๊ทธ๋ฆฌ๊ณ ์ด์ React-Router์ ํต์ฌ ์ปดํฌ๋ํธ ๋ค์ ๋ํด์ ์ ์ ์์๋ณด์.
react-router-dom์ ํต์ฌ Component
react-router-dom์ ํต์ฌ ์ปดํฌ๋ํธ๋ ์๋์ ๊ฐ์ ๊ฒ๋ค์ด ์๋ค.
- Route
- BrowserRouter
- Link
- Switch
Route
<Route>
์ปดํฌ๋ํธ๋ ๊ณต์ ๋ฌธ์์์ ๊ฐ์ฅ ์ค์ํ Lowe Level ์ปดํฌ๋ํธ๋ผ๊ณ ํํํ ๋งํผ ์ค์ํ๋ค.
ํด๋น ๊ฒฝ๋ก๊ฐ ํ์ฌ ๊ฒฝ๋ก์ ์ผ์นํ ๋ UI์ ์ผ๋ถ๋ฅผ renderํ๋ ์ญํ ์ ์ํํ๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก๋ ๋ค์๊ณผ ๊ฐ๋ค.
์์ ๊ฐ์ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ง๋ง 4.0 version ๋ถํฐ BrowserRouter๋ HashRouter, MemoryRouter, NativeRouter์ ๊ฐ HighLevel Router๊ณผ ํจ๊ป ์ฌ์ฉํด์ผ ์ ๋๋ก ๋์ํ๋ค.
์ฐ๋ฆฌ๊ฐ <Route>
์ปดํฌ๋ํธ๋ฅผ ์ด์ฉํด์ ๊ฐ ํ์ด์ง๋ฅผ ์ ์ํ ์ ์๋ค.
๋ง์ฝ ์ฃผ์๊ฐ path ์์ฑ๊ฐ์ผ๋ก ์์ํ๋ค๋ฉด ์ปดํฌ๋ํธ ์์ฑ ๊ฐ์ด ๊ฐ๋ฆฌํค๋ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ๋ค.
<Route>
ํ๊ทธ์ exact ์์ฑ๊ณผ path ์์ฑ์ด ์๋๋ฐ exact ์์ฑ์ ๋ค์์ ๋ฐฐ์ธ ๋ผ์ฐํ
์ฌํ์์ ๋ค๋ฃจ๊ฒ ๋ค. ๊ถ๊ธํ ์ฌ๋์ ์ด๋ ค์ด ๋ด์ฉ์ด ์๋๋ฏ๋ก ๋จผ์ ์ฐพ์๋ด๋ ๋ฌด๋ฐฉํ๋ค.
BrowserRouter
<BrowserRouter>
๋ ๋ธ๋ผ์ฐ์ ํ์คํ ๋ฆฌ API๋ฅผ ์ฌ์ฉํด์ ๋ผ์ฐํ
์ ํ ์ ์๊ฒ ๋์์ค๋ค.
Link
<Link>
์์ฑ์ ํ์ด์ง๋ฅผ ์ ํ์์ผ์ฃผ๋ ์ญํ ์ ํ๋ฉฐ to ์์ฑ ๊ฐ์ผ๋ก ์ด๋ํ ์ฃผ์๋ฅผ ๋ํ๋ผ ์ ์๋ค.
์ฐ๋ฆฌ๊ฐ ๋งํฌ ํ๊ทธ๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค๋ฉด ์๋์ผ๋ก a ํ๊ทธ๋ก ์ปดํ์ผ ๋๋ฉฐ a ํ๊ทธ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ซ๋ค๋ฉด ๋ค๋ฅธ ํ๊ทธ๋ฅผ ์จ์ผํ๋๋ฐ, ๋ค์์ ์ด์ผ๊ธฐ ํด๋ณด์.
์ฌ์ฉ ๋ฐฉ๋ฒ์
<Link path="/url">์ด๋ฆ</Link>
Switch
<Switch>
๋ ์ฌ๋ฌ ๋ผ์ฐํ
๊ฒฝ๋ก๊ฐ ์กด์ฌํ ๋, ๊ฒฝ๋ก์ ์ผ์นํ๋ ๊ฒฝ๋ก๋ง ํ์ํด์ฃผ๋ ์ญํ ์ ํ๋ค. ์ฃผ๋ก ์ฌ๋ฌ Route๋ฅผ ํฉ์ฑ์ํฌ ๋ ์ฌ์ฉํ๋ค.
์ฌ์ฉ ๋ฒ์ ์๋์ ๊ฐ๋ค.
<Router>
<Switch>
<Route path="/url1">url1</Route>
<Route path="/url2">url2</Route>
</Switch>
</Router>
๋ง์ฝ ์ฐ๋ฆฌ๊ฐ Switch ํ๊ทธ๋ง ์ฌ์ฉํ๋ค๋ฉด ํ์ด์ง ์ ํ ํ๋ ์ง์ ์ ์ด ์๊ธฐ ๋๋ฌธ์ ๋ณดํต์ Link ํ๊ทธ๋ ๋ค๋ฅธ ํํ๋ก ์ง์ ์ UI๋ฅผ ๊ตฌ์ฑํด์ฃผ๊ณ Switch๋ก Route ํ๊ทธ๋ฅผ ์ค์ฒฉํด์ ์ฌ์ฉํ๋ค.
๊ตฌ์กฐ ๊ทธ๋ฆผ์ผ๋ก ์ดํดํ๊ธฐ
์ด๋ฐ ๊ตฌ์กฐ๊ฐ ์๋นํ ๋ณต์กํด ๋ณด์ผ ์ ์๋ค.
๊ทธ๋์ ์๋์ ๊ทธ๋ฆผ์ผ๋ก ๊ฐ๋จํ๊ฒ ์ดํดํด๋ณด์.
React๋ก ๋ง๋ค์ด๋ณด๊ธฐ
์ด์ ๋์ถฉ react-router-dom ๊ตฌ์กฐ๋ฅผ ์ดํดํ์ผ๋ ์๊น ์ฒ์ ๋ดค๋ ํ์ด์ง๋ฅผ ๋ง๋ค์ด๋ณด์.
์์๋
- BrowserRouter๋ก ํ์คํ ๋ฆฌ API ์ฃผ์ ํ๊ธฐ
- UI๋ฅผ ์ํด Link ํ๊ทธ๋ก ๋ผ์ฐํ ์ํธ๋ฆฌ ํฌ์ธํธ ๋ง๋ค๊ธฐ
- Switch ํ๊ทธ๋ก ์ฌ๋ฌ URL ์ ํํ ์ ์๊ฒ ํ๊ธฐ
- ๊ฐ๊ฐ์ URL์ Route ํ๊ทธ๋ก ๋ง๋ค์ด์ฃผ๊ธฐ
Link ํ๊ทธ๋ก ๋ผ์ฐํ ์ํธ๋ฆฌ ํฌ์ธํธ ๋ง๋ค๊ธฐ
์ด์ UI์์ ๋ฒํผ์ด ํฌํจ๋ li ํ๊ทธ๋ฅผ ๋ณผ ์ ์๋ค.
Switch ํ๊ทธ๋ก ๊ฐ๊ฐ์ ๋ผ์ฐํ ์ค์ ํ๊ธฐ
์๋๋ผ๋ฉด ํ๋์ root ํ๊ทธ ์ปจํ ์ด๋๋ก ๊ฐ์ธ์ค์ผ ํ์ง๋ง ๋น ๋ฅธ ์ดํด๋ฅผ ์ํด์ ๋ค๋ฅธ BrowserRouter ํ๊ทธ๋ฅผ ์ด์ฉํ๋ค. ๋ฐ์ ์์ค ์ฝ๋์์ ํ๋๋ก ํตํฉํ ๊ฒ์ด๋ ์ผ๋ คํ์ง ์์๋ ๋๋ค.
๊ฐ๊ฐ์ URL์ ๋ณด์ฌ์ง ๋ ๋ ๊ตฌํํ๊ธฐ
์ด์ ๋ชจ๋ ๊ตฌ์ฑ์ด ๋๋ฌ๋ค.
๊ฒฐ๊ณผ ํ๋ฉด์ ๋ด๋ณด์.
์ ์ฒด ์์ค ์ฝ๋
import React, { Component } from 'react';
import './App.css';
import { BrowserRouter, Switch, Route, Link } from 'react-router-dom';
class App extends Component {
render(){
return (
<BrowserRouter>
<ul>
<li>
<Link to="Home"><button>home</button></Link>
</li>
<li>
<Link to="About"><button>About</button></Link>
</li>
<li>
<Link to="Dashboard"><button>Dashboard</button></Link>
</li>
</ul>
<Switch>
<Route path="/Home">
<Home />
</Route>
<Route path="/About">
<About />
</Route>
<Route path="/Dashboard">
<Dashboard />
</Route>
</Switch>
</BrowserRouter>
);
}
}
function Home(){
return (
<div>
์ด ๊ณณ์ ํ ํ์ด์ง ์
๋๋น.
</div>
);
}
function About() {
return (
<div>
์ฐ๋ฆฌ ์ฌ์ดํธ๋ React๋ฅผ ํธํ๊ฒ ์ฌ์ฉํ๊ธฐ ์ํด์ ์ง์
์ฅ๋ฒฝ์ ๋ฎ์ถฐ์ฃผ๋ ์ฌ์ดํธ ์
๋๋ค.
</div>
);
}
function Dashboard() {
return (
<div>
์ด ๊ณณ์ ์ง๋ฌธ์ ํ๋ ๊ฒ์ํ ์
๋๋น.
</div>
);
}
export default App;
์ด๋ ๊ฒ Single Page Application์ ๊ตฌ์ฑํ๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ๋ํด ๋ชจ๋ ์์๋ณด์๋ค. ์ ํ์ ์์ ์ง๋ง ๊ฐ์ธ์ ์ผ๋ก๋react-router-dom
์ ๋ ์ถ์ฒํ๋ค. ์ด์ ๋ ๋์ฑ ๋ง์ ๊ธฐ๋ฅ๋ค์ด ๋ค์ด๊ฐ ์ฌ์ฉํ๊ธฐ์ ์ฝ๊ณ ํธํ๋ฉฐ ๋ ํผ๋ฐ์ค๊ฐ ํ๋ถํ๊ธฐ ๋๋ฌธ์ด๋ค.
์งง์ ์๋ฆฌ์ฆ์์ง๋ง ๋์๊ฒ๋ ์๋นํ ์ ์ตํ์๊ณ ๋ณด๋ ๋ชจ๋ ์ด๋ค์๊ฒ ์กฐ๊ธ์ด๋๋ง ๋์์ด ๋์์ผ๋ฉด ์ข๊ฒ ๋ค :)
๋๊ธ