๋จ์ผ ํ์ด์ง๋ก ์ด๋ฃจ์ด์ง ์ ํ๋ฆฌ์ผ์ด์
์ ํต์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ๋ฌ ๊ฐ์ ํ์ด์ง๋ก ๊ตฌ์ฑ๋์ด ์๋๋ฐ์. ์ด๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉ์๋ ํ์ด์ง๋ฅผ ์ด๋ํ ๋๋ง๋ค ์๋ก์ด HTML์ ๋ฐ์์ผํ๋๋ฐ์. ์ ์ ์น์์ ์ ๊ณตํ๋ ์ ๋ณด๊ฐ ๋ง์์ง๋ฉด์ ์์ ๊ฐ์ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ์ฑ๋ฅ์ ์ธ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ฒ ๋์์ต๋๋ค.
๊ทธ๋์ ์ฐ๋ฆฌ๋ ๋ฆฌ์กํธ
์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด ๋ทฐ ๋ ๋๋ง์ ๋ด๋น์ํค๊ณ , ์ฌ์ฉ์์์ ์ธํฐ๋ ์
์ด ํ์ํ ๋ถ๋ถ์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ฌ ์
๋ฐ์ดํธํ์ฌ ํ๋ฉฐ ์์ ๊ฐ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
SPA
๋ ์ฌ์ฉ์์๊ฒ ์ ๊ณตํ๋ ํ์ด์ง๋ ํ ์ข
๋ฅ์ด์ง๋ง, ํด๋น ํ์ด์ง์์ ๋ก๋ฉ๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ํ์ฌ ์ฌ์ฉ์ ๋ธ๋ผ์ฐ์ ์ ์ฃผ์ ์ํ์ ๋ฐ๋ผ ๋ค์ํ ํ๋ฉด์ ๋ณด์ฌ์ค ์ ์์ต๋๋ค. ์ด๊ฒ์ ๋ผ์ฐํ
(Routing)
์ด๋ผ๊ณ ํฉ๋๋ค.
๋ค๋ฅธ ์ฃผ์(url)์ ๋ค๋ฅธ ํ๋ฉด์ ๋ณด์ฌ์ฃผ๋ ๊ฒ
<Router>
๋<Switch>
์<Route>
์ ๊ณตํต ์์ ์ปดํฌ๋ํธ
๋จผ์ , ๋ผ์ฐํฐ๋ฅผ ์ฌ์ฉํ ํ๋ก์ ํธ์ react-router-dom
๋ฅผ ์ค์นํด์ค๋๋ค.
npm install react-router-dom --save
++ ์ถ๊ฐ์ ์ผ๋ก react-router
์ react-router-dom
์ฐจ์ด์
react-router-dom : ์น์ฉ ์ปดํฌ๋ํธ ํฌํจ
react-router-native : react-native๋ฅผ ํ์ฉํ ์ฑ์ฉ ์ปดํฌ๋ํธ ํฌํจ
react-router : ์น/์ฑ ๋๋ค ํฌํจ
๋จผ์ , <Link>
์ปดํฌ๋ํธ์ <Route>
์ปดํฌ๋ํธ๊ฐ ๋ฌด์์ธ์ง ์ ๋ฆฌํ๊ณ ์ฝ๋์ ์ ์ฉํด๋ณด๋ก ํ ๊ฒ์!
<Link>
์ปดํฌ๋ํธ๋ HTML์ <a>
ํ๊ทธ์ ์ ์ฌํ ๊ธฐ๋ฅ์ ํ๋๋ฐ์! <Link>
๋ to
์์ฑ์ ์ฌ์ฉํ์ฌ ์ด๋ํ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค.
<Link to="/">HOME ํ์ด์ง๋ก ์ด๋ํ๊ธฐ</Link>
<Link to="/intro">INTRO ํ์ด์ง๋ก ์ด๋ํ๊ธฐ</Link>
<Route>
์ปดํฌ๋ํธ๋ ์ผ๋ฐ์ ์ผ๋ก ํ์ฌ URL์ ๋ฐใ
ใน ํน์ ํ๋ฉด์ ๋ณด์ฌ์ฃผ๊ฑฐ๋ ์จ๊ธฐ๊ธฐ ์ํด์ ์ฌ์ฉ๋๋๋ฐ์.
<Route path="/" component={Home} exact={true} />
<Route path="/intro" component={Intro} />
<Route>
์ปดํฌ๋ํธ์ component
์์ฑ์ ์ด์ฉํด ํ๋ฉด์ ๋ณด์ฌ์ค ์ปดํฌ๋ํธ๋ฅผ ์ง์ ํด์ค ์ ์์ต๋๋ค. ๋ํ, path
์์ฑ์ url์ ์ง์ ํ์ฌ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ํ, ์ฌ๋ฌ url์์ ํ๋์ ์ปดํฌ๋ํธ๋ฅผ ๋ณด์ฌ์ฃผ๊ณ ์ถ์ ๋์๋ ๋ฐฐ์ด์ ์ฌ์ฉํ์ฌ ์ค์ ํ ์ ์์ด์!
<Route component={Intro} path={["/intro", "/info"]} />
์๋ ์ฝ๋๋ <Link>
์ <Route>
๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑํ ์ฝ๋์
๋๋ค:)
์ถ๊ฐ์ ์ผ๋ก <Switch>
๋ <Route>
๋ค ์ค์ ์กฐ๊ฑด์ ๋ง๋ ํ๋์ ๋ผ์ฐํธ๋ฅผ ๋ ๋๋งํ๋๋ฐ์.
import { BrowserRouter, Link } from "react-router-dom";
import { Route, Switch } from "react-router";
import Home from "./page/Home";
import Intro from "./page/Intro";
import NotFound from "./page/NotFound";
const AppRouter = () => {
return (
<BrowserRouter>
<Link to="/">HOME ํ์ด์ง๋ก ์ด๋ํ๊ธฐ</Link>
<br />
<Link to="/intro">INTRO ํ์ด์ง๋ก ์ด๋ํ๊ธฐ</Link>
<Switch>
<Route path="/" component={Home} exact={true} />
<Route path="/intro" component={Intro} />
<Route component={NotFound} />
</Switch>
</BrowserRouter>
);
};
export default AppRouter;
๋ฐ์ดํฐ๋ฅผ ์กฐํ๋ ์์ฒญํ ๋ ํ๋ผ๋ฏธํฐ ๊ฐ์ ์ฌ์ฉํ๋๋ฐ์. <Route>
์ปดํฌ๋ํธ์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ณด๋ฅผ ๋ณด์ฌ์ฃผ๋ ์ฝ๋๋ฅผ ์์ฑํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๋จผ์ , userId
๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์์ ํด๋น user์ ์ ๋ณด๋ฅผ ๋ณด์ฌ์ฃผ๋ Profile
์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์์ต๋๋ค.
import React from "react";
const users = {
1: { name: "์ก์ฐ๋ ", description: "Front-end Dev" },
2: { name: "๋จน๊นจ๋น", description: "Back-end Dev" },
};
const Profile = ({ match }) => {
const { userId } = match.params;
const user = users[userId];
return (
<div>
<h1> PROFILE PAGE </h1>
<p>{user.name}์
๋๋ค!</p>
<p>{user.description}</p>
</div>
);
};
export default Profile;
์ฌ๊ธฐ์ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ์์ฌ ๋์๋ match
๊ฐ์ฒด ์์ params
๊ฐ์ ์ฐธ์กฐํฉ๋๋ค. match
๊ฐ์ฒด ์์๋ ํ์ฌ ์ปดํฌ๋ํธ๊ฐ ์ด๋ค ๊ฒฝ๋ก ๊ท์น์ ๋ฐ๋ฅด๋์ง์ ๋ํ ์ ๋ณด๊ฐ ๋ค์ด ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์์ AppRouter
์ปดํฌ๋ํธ์ ์๋ ์ฝ๋๋ฅผ ์ถ๊ฐํด์ฃผ์์ต๋๋ค.
์ง์ ํ ํ๋ผ๋ฏธํฐ ์์ :
์ ๋ถ์ฌ ์ฌ์ฉํฉ๋๋ค. ์ ๋ userId
๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ์ฃผ์๊ธฐ ๋๋ฌธ์ :userId
๋ฅผ ๋ถ์ฌ์ฃผ์์ด์!
<Route path="/profile/:userId" component={Profile} />
์ด๋ฒ์ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด๋ ค๊ณ ํฉ๋๋ค.
์ฟผ๋ฆฌ๋ location
๊ฐ์ฒด์ ์๋ "search"
๊ฐ์์ ์ฝ์ด์ฌ ์ ์๋๋ฐ์! ์ด location
๊ฐ์ฒด์๋ ํ์ฌ ์ฑ์ด ๊ฐ์ง๊ณ ์๋ ์ฃผ์ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ค๊ณ ํฉ๋๋ค.
๐ป location
ํํ ์์
"search"
๊ฐ์ ๋ฌธ์์ด ํํ๋ก ๋์ด ์๋๋ฐ์. ์ด๋ฐ ์ฟผ๋ฆฌ ๋ฌธ์์ด์ ๊ฐ์ฒด๋ก ๋ณํํ์ฌ ์ฌ์ฉํ๊ธฐ ์ํด qs
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
npm install qs --save
๊ทธ๋ฆฌ๊ณ ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํ์ฌ ์ค๋๋ค. admin
๊ฐ์ true / false
์ฌ๋ถ์ ๋ฐ๋ผ ํ๋ฉด์ ๋ณด์ฌ์ค๋๋ค.
import React from "react";
import qs from "qs";
const ManageUser = ({location}) => {
const query = qs.parse(location.search, {
ignoreQueryPrefix: true
});
const isAdmin = query.admin === 'true';
return (
<div>
<h1>ADMIN PAGE</h1>
{isAdmin && <p>๊ด๋ฆฌ์ ์
๋๋ค.</p>}
{!isAdmin && <p>๊ด๋ฆฌ์ ์๋๋๋ค.</p>}
</div>
);
};
export default ManageUser;