์ ์ ์ฌ์ฉํ ๋ธ๋ผ์ฐ์ ํ์คํ ๋ฆฌ api๋ฅผ ์ด์ฉํด์ ํ์ด์ง ๋ผ์ฐํ ์ฒ๋ฆฌ๋ฅผ ์ง์ ๊ตฌํํ ์๋ ์์ง๋ง ์ ๊ฒฝ ์ธ ๋ถ๋ถ์ด ๋๋ฌด ๋ง๊ธฐ์, react-router-dom์ ์ด์ฉํ์ฌ ๋จ์ผ ํ์ด์ง ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค์ด๋ณด์. ์ด ํจํค์ง๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๊ฒ ๊ตฌํํ ์ ์๋ค.
npm install react-router-dom
react-router๋ ์น๋ฟ๋ง ์๋๋ผ ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ๋ ์ง์ํ๋ค. ์์ ์ค์นํ ํจํค์ง๋ ์ด๋ฆ์์ ์ ์ ์๋ฏ์ด ์น์ ์ํ react-router ํจํค์ง๋ค. ๊ทธ๋ฆฌ๊ณ ๋ผ์ฐํ ์์์ ๋ ๋ผ์ฐํ ๊ฐ๋ฅํ๋ค.
import React from "react";
import { BrowserRouter, Route, Link } from "react-router-dom";
import Rooms from "./Rooms";
export default function RRdom() {
return (
<BrowserRouter>
<div style={{ padding: 20, border: "5px solid gray" }}>
<Link to="/">ํ</Link>
<br />
<Link to="/photo">์ฌ์ง</Link>
<br />
<Link to="/rooms">๋ฐฉ์๊ฐ</Link>
<br />
<Route exact path="/" component={Home} />
<Route path="/photo" component={Photo} />
<Route path="/rooms" component={Rooms} />
</div>
</BrowserRouter>
);
}
function Home({ match }) {
return <h2>์ด๊ณณ์ ํํ์ด์ง์
๋๋ค.</h2>;
}
function Photo({ match }) {
return <h2>์ด๊ณณ์ ํํ์ด์ง์
๋๋ค.</h2>;
}
react-router-dom ํจํค์ง๋ฅผ ์ด์ฉํด ๊ฐ์ข ์ปดํฌ๋ํธ๋ค์ import ์์ผฐ๋ค. react-router-dom์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ์ ์ฒด๋ฅผ ์ปดํฌ๋ํธ๋ก ๊ฐ์ธ์ผํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฒํผ์ ํตํด ํ์ด์ง๋ฅผ ์ ํํ ๋๋ react-router-dom์์ ์ ๊ณตํ๋ Link ์ปดํฌ๋ํธ ์ฌ์ฉํ๋ค. to ์์ฑ๊ฐ์ ์ด๋ํ ์ฃผ์๋ฅผ ๋ํ๋ธ๋ค. react-router-dom์ Route ์ปดํฌ๋ํธ๋ฅผ ์ด์ฉํด์ ๊ฐ ํ์ด์ง๋ฅผ ์ ์ํ๋ค. ํ์ฌ ์ฃผ์๊ฐ path์์ฑ์ผ๋ก ์์ํ๋ฉด ์ปดํฌ๋ํธ ์์ฑ๊ฐ์ด ๊ฐ๋ฅดํค๋ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ๋ค.
์๋ฅผ๋ค์ด, localhost:3000/photo/abc๋ฅผ ์ ๋ ฅํ์ ๋์ ์ฃผ์๊ฐ /photo๋ก ์์ํ๋ฏ๋ก photo์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง์ด ๋๋ค. ๊ทธ๋ฌ๋ localhost:3000/photo123์ ์ ๋ ฅํ๋ฉด Photo ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋์ง ์๋๋ค. ์ด๋ ์ฌ๋์(/) ๋จ์๋ก ๋น๊ต๋ฅผ ํ๊ธฐ ๋๋ฌธ์ด๋ค. exact ์์ฑ๊ฐ์ ์ ๋ ฅํ๋ฉด ๊ทธ ๊ฐ์ด ์์ ํ ์ผ์นํด์ผ ํด๋น ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋๋ค. ๋ง์ฝ Home ์ปดํฌ๋ํธ ๋ถ๋ถ์์ exact ์์ฑ๊ฐ์ ์ ๋ ฅํ์ง ์์๋ค๋ฉด Home ์ปดํฌ๋ํธ๋ ํญ์ ๋ ๋๋ง๋๋ค.
๊ทธ๋ฆฌ๊ณ path ์์ฑ๊ฐ์ ๊ฐ์ง๋ Route ์ปดํฌ๋ํธ๋ฅผ ์ฌ๋ฌ ๋ฒ ์์ฑํด๋ ๋๋ค.
<Route path="/photo" component={Photo} />
<Route path="/photo" component={Rooms} />
์ด์ฒ๋ผ ํ์ฌ ์ฃผ์๊ฐ photo๋ก ์์ํ๋ค๋ฉด ์์ ์ ์ ๋ ์ปดํฌ๋ํธ photo, rooms ๋ ๋ค ๋ชจ๋ ๋ ๋๋ง๋๋ค.
import React from "react";
import { Route, Link } from "react-router-dom";
const Rooms = ({ match }) => {
return (
<div>
<h2>์ฌ๊ธฐ๋ ๋ฐฉ์ ์๊ฐํ๋ ํ์ด์ง์
๋๋ค.</h2>
<Link to={`${match.url}/blueRoom`}>ํ๋๋ฐฉ</Link>
<br />
<Link to={`${match.url}/greenRoom`}>์ด๋ก๋ฐฉ</Link>
<br />
<Route path={`${match.url}/:roomId`} component={Room} />
<Route
exact
path={match.url}
render={() => <h3>๋ฐฉ์ ์ ํํด ์ฃผ์ธ์.</h3>}
/>
</div>
);
};
export default Rooms;
function Room({ match }) {
return <h2>{`${match.params.roomId}๋ฐฉ์ ์ ํํ์
จ์ต๋๋ค.`}</h2>;
}
Rooms ์ปดํฌ๋ํธ ๋ด๋ถ์๋ ๋๋ค์ ๋ผ์ฐํ ์ ์ฒ๋ฆฌํ๋ ์ฝ๋๊ฐ ๋ค์ด ์๋ค. Route๋ฅผ ํตํด์ ๋ ๋๋ง๋๋ ์ปดํฌ๋ํธ๋ match๋ผ๋ ์์ฑ๊ฐ์ ์ฌ์ฉํ ์ ์๋ค. match.url์ Route ์ปดํฌ๋ํธ์ path ์์ฑ๊ฐ๊ณผ ๊ฐ๋ค. ๋ฐ๋ผ์ Rooms ์ปดํฌ๋ํธ์ match.url์ /rooms์ ๊ฐ๋ค. Route์ปดํฌ๋ํธ์ path ์์ฑ๊ฐ์์ ์ฝ๋ก ์ ์ฌ์ฉํ๋ฉด ํ๋ผ๋ฏธํฐ๋ฅผ ๋ํ๋ผ ์ ์๋ค. ์ถ์ถ๋ ํ๋ผ๋ฏธํฐ๋ match.params.{ํ๋ผ๋ฏธํฐ ์ด๋ฆ}ํ์์ผ๋ก
match ๊ฐ์ฒด์๋ ์ URL์ด ๋งค์นญ๋ ๋ํ ์ ๋ณด๊ฐ ๋ด๊ฒจ์ ธ์๋ค. ๋ํ์ ์ผ๋ก match.params๋ก path์ ์ค์ ํ ํ๋ผ๋ฏธํฐ๊ฐ์ ๊ฐ์ ธ์ฌ ์ ์๋ค.
path : [string] ๋ผ์ฐํฐ์ ์ ์๋ path
url : [string] ์ค์ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์์ฒญ๋ url path
isExact : [boolean] true์ผ ๊ฒฝ์ฐ ์ ์ฒด ๊ฒฝ๋ก๊ฐ ์์ ํ ๋งค์นญ๋ ๊ฒฝ์ฐ์๋ง ์์ฒญ์ ์ํ
params : [JSON object] url path๋ก ์ ๋ฌ๋ ํ๋ผ๋ฏธํฐ ๊ฐ์ฒด
length [number] ์ ์ฒด history ์คํ์ ๊ธธ์ด
action [string] ์ต๊ทผ์ ์ํ๋ action (PUSH, REPLACE or POP)
location [JSON object] ์ต๊ทผ ๊ฒฝ๋ก ์ ๋ณด
push(path, [state]) [function] ์๋ก์ด ๊ฒฝ๋ก๋ฅผ history ์คํ์ผ๋ก ํธ์ํ์ฌ ํ์ด์ง๋ฅผ ์ด๋
replace(path, [state]) [function] ์ต๊ทผ ๊ฒฝ๋ก๋ฅผ history ์คํ์์ ๊ต์ฒดํ์ฌ ํ์ด์ง๋ฅผ ์ด๋
go(n) [function] history ์คํ์ ํฌ์ธํฐ๋ฅผ n๋ฒ์งธ๋ก ์ด๋
goBack() [function] ์ด์ ํ์ด์ง๋ก ์ด๋
goForward() [function] ์ ํ์ด์ง๋ก ์ด๋
block(prompt) [function] history ์คํ์ PUSH/POP ๋์์ ์ ์ด