React ๊ฐ๋ฐ ์ ๊ท์ฐฎ์ ํ๊ฒฝ ์ธํ ์ ๊ธฐ์ต์ด ๋์ง ์์ ๋ ์ผ์ผ์ด ์ฐพ์ ์ฌ์ฉํ๊ธฐ ๋ฒ๊ฑฐ๋กญ๊ธฐ ๋๋ฌธ์ ๋ฏธ๋ฆฌ ์ ๋ฆฌํด ๋๊ธฐ๋ก ํ์ต๋๋ค.
์ฐธ์กฐ 1: https://reactrouter.com/web/guides/quick-start
์ฐธ์กฐ 2: ๋ฆฌ์กํธ๋ฅผ ๋ค๋ฃจ๋ ๊ธฐ์ ์์ - ๋ฒจ๋ก ํผํธ
๊ฐ์
SPA์ ๋จ์ ์ค ํ๋๋ ๋๋ฌด ๋ง์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ํ ๋ฒ์ ๋ถ๋ฌ์จ๋ค๋ ๊ฒ์ธ๋ฐ,
์ด ๋ฌธ์ ๋ ์ฝ๋์คํ๋ฆฟ์ ํตํด ํด์ํ ์ ์๋๋ฐ ๋ผ์ฐํธ ๋ณ๋ก ํ์ผ๋ค์ ๋๋์ด ํธ๋ํฝ๊ณผ ๋ก๋ฉ ์๋๋ฅผ ๊ฐ์ ํ ์ ์๋ค๊ณ ํฉ๋๋ค. ํ์ด ์ง์ง๊ฐ ์ฌ๋ฌ ๊ฐ์ธ ์ฌ์ดํธ๋ ๊ฑฐ์ ํ์๋ก ์ ์ฉ๋๋ค๊ณ ๋ณด๋ฉด ๋ฉ๋๋ค.
์ค์น
yarn add react-router-dom
์ค๋ช
- BrowserRouter: ์ฃผ์์ ๋ํ ์ ๋ณด๋ฅผ props์ ๋ด์ ์กฐํํ๊ฑฐ๋ ์ฌ์ฉํ ์ ์๋ค.
- : HTML5์ History API๋ฅผ ์ฌ์ฉํ์ฌ ํ์ด์ง๋ฅผ ์๋ก๊ณ ์นจ ํ์ง ์๊ณ ์ฃผ์๋ฅผ ๋ณ๊ฒฝํ๋ค.
- Link: history API๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ทธ๋๋ก ๋๊ณ ๊ฒฝ๋ก๋ง ๋ณ๊ฒฝํ๋ค.
- : a ํ๊ทธ๋ ํ์ด์ง๋ ์ ํํ๋ ๊ณผ์ ์์ ์๋ก์ด ํ์ด์ง๋ฅผ ๋ถ๋ฌ์ด์ผ๋ก Link๋ฅผ ์ฌ์ฉํ๋ค.
- URL Paramter || Query Parameter
- URL Parameter
- : /user/info
- Query Paramter
- : /user?detail=info
๋น ๋ฅด๊ฒ ์ธํ ํ๊ธฐ
1. ๋ผ์ฐํฐ๊ฐ ํ์ํ ์์ญ ์ ์ฒด๋ฅผ BrowserRouter๋ก ๊ฐ์ธ์ฃผ๊ธฐ
: ๊ผญ index.js ์์ ๊ฐ์ธ์ค ํ์๋ ์์ง๋ง ๋๋ถ๋ถ์ ์ฌ์ดํธ๋ ์ ์ญ์ ์๋๋ก ํ๋ฉด ์ ํ์ ํ๋ฏ๋ก index.js๋ App.js, ํน์ ๋ฉ์ธ์ด ๋๋ ํ์ด์ง์์ ๊ฐ์ธ๋๋ก ํฉ๋๋ค. ๊ทธ๋์ผ ์ ๋ฌ๋๋ props๊ฐ์ ๋ฐ์ ์ ์์ด ์ ๋๋ก ์๋์ด ๋ฉ๋๋ค.
// index.js
import { BrowserRouter } from 'react-router-dom';
ReactDOM.render(
<BrowserRouter>
<React.StrictMode>
<App />
</React.StrictMode>
</BrowserRouter>,
document.getElementById('root')
);
2. ๋งํฌ ๋ง๋ค์ด์ฃผ๊ธฐ (๋ด๋น๊ฒ์ด์ )
๋ฆฌ์กํธ๋ ํ์ด์ง ์ด๋์ ์ํด a ํ๊ทธ ๋์ Link๋ผ๋ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
a ํ๊ทธ๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด ํ์ด์ง ์๋ก๊ณ ์นจ์ด ์ผ์ด๋๊ธฐ ๋๋ฌธ์ SPA ๊ฐ๋ฐ ํน์ฑ์ ์ ์ฒด ์๋ก๊ณ ์นจ์ด ์๋ ๋ถ๋ถ ๋ ๋๋ฅผ ํด์ผํ๊ธฐ ๋๋ฌธ์ a ํ๊ทธ ๋์ Link ํ๊ทธ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๋ ๋ ์ดํ์ ๊ฐ๋ฐ์ ๋ชจ๋์์๋ a ํ๊ทธ๋ก ํ์ธ์ด ๊ฐ๋ฅํ๋ฉด css ๋ํ a ํ๊ทธ๋ก ์๊ฐํ๊ณ ์คํ์ผ์ ์ ํ๋ฉด ๋ฉ๋๋ค.
// Nav.js
import React from 'react'
import { Link } from 'react-router-dom'
function Nav() {
return (
<ul className="navList">
<li className="navItem"><Link to="/">Home</Link></li>
<li className="navItem"><Link to="/info">Info</Link></li>
<li className="navItem"><Link to="/user">User</Link></li>
</ul>
)
}
export default Nav
3. ๋งํฌ ๋ณ ํ์ด์ง ๋ง๋ค๊ธฐ
ํน์ url ์ด์ธ์ ๋ค๋ฅธ ๊ฒฝ๋ก๋ก ์ ์ํ์ ๊ฒฝ์ฐ ๋ฌด์กฐ๊ฑด 404 ํ์ด์ง๋ฅผ ๋์ฐ๊ณ ์ถ๋ค๋ฉด
๋ง์ง๋ง์ NotFound ํ์ด์ง๋ฅผ Route์ ๊ฑธ์ด์ฃผ๋ฉด ๋ฉ๋๋ค.
// App.js
import {
Switch,
Route
} from 'react-router-dom'
//components
import Nav from './components/Nav'
import {
Home,
Info,
User,
NotFound
} from './pages'
function App() {
return (
<div className="App">
<Nav/>
<hr/>
<Switch>
<Route exact path="/" component={Home}/>
<Route exact path="/user" component={User}/>
<Route exact path="/info" component={Info}/>
<Route component={NotFound} /> // url์ด /, /user, /info์ ์๋ ๋ชจ๋ ๊ฒฝ์ฐ NotFound๊ฐ ๋ ๋๋ฉ๋๋ค
</Switch>
</div>
);
}
export default App;
4-1. URL Paramter ์ฌ์ฉํ๊ธฐ
user๋ผ๋ ํ์ด์ง์ userid๋ผ๋ ์ด๋ฆ์ผ๋ก ๊ฐ์ ์ ๋ฌํฉ๋๋ค.
๋ง์ฝ url์ '/user/hong'์ด๋ผ๊ณ ์ ์์ ํ๋ฉด, ์ปดํฌ๋ํธ ํ์ด์ง์์๋ userid='hong'์ผ๋ก ๋ด๊ฒจ์ต๋๋ค.
// - App.js
- App.js
<Switch>
{...}
<Route exact path={["/user/:userid", "/user"]} component={User}/>
</Switch>
์ ๊ฐ(๋์ด์ค๋ userid์ value๊ฐ)์ ์ ๊ทผ์ ํ๊ธฐ ์ํด์
match.params. ํค๊ฐ (์ฌ๊ธฐ์ ํค๊ฐ์ userid๊ฐ ๋ฉ๋๋ค.)์ผ๋ก ์ ๊ทผํ์ฌ ๊ฐ์ ๋ฐ์๋ณผ ์ ์์ต๋๋ค.
- User.js
// ๋ชฉ์
๋ฐ์ดํฐ
const data = {
user1: {
name: 'ํ๊ธธ๋',
userId: 'hong'
},
user2: {
name: '๊น๋๋ฆฌ',
userId: 'kim'
}
}
const User = ({ match }) => {
const userid = match.params.userid; // match.params๋ก ํ๋ผ๋ฏธํฐ๊ฐ์ ๋ฐ์ ์ ์์
const userId2 = data[userid]; // ์ data๋ชฉ์
๋ฐ์ดํฐ ์์ ํค๊ฐ์ ์ฐพ์ ์กด์ฌ์ฌ๋ถ ํ์ธ
return (
<div>
This is User Page! <br/>
{
userId2 ?
<p>User id is {userid}</p> :
<p>No User</p>
}
</div>
)
}
export default User
4-2. Query Paramter ์ฌ์ฉํ๊ธฐ
url parameter์์๋ url/:key ์ด๋ ๊ฒ ๊ฐ์ ์ ๋ฌํ๋ค๋ฉด,
query parameter์์๋ /url? key=value ์ด๋ ๊ฒ ๊ธฐ์กด get ๋ฐฉ์์ ์ฌ์ฉํฉ๋๋ค. (์ ๋ ์ง๊ธ๋ ๋ช ์นญ์ด ๋๋ฌด ํ๊ฐ๋ฆฝ๋๋ค ^^;;)
- App.js
<Route exact path={["/info?userid='user1'", "/info"]} component={Info}/>
๋์ ๊ฐ์ ๋ฐ์๋ณด๊ธฐ ์ํด url๋ค์ ๋ถ์? ๊ฐ์ ์ ๊ฑฐํ๊ธฐ ์ํด ํ ๋ฒ ๋ ์์ ์ ํด์ฃผ๋ฉด ๊น๋ํ๊ฒ ๊ฐ์ ๋ฐ์๋ณผ ์ ์์ต๋๋ค.
์ ๋ '๋ฆฌ์กํธ๋ฅผ ๋ค๋ฃจ๋ ๊ธฐ์ '์ด๋ผ๋ ์ฑ ์ ๋ณด๊ณ ํ์ต์ ํ์๊ธฐ ๋๋ฌธ์ ํด๋น ์์ ์์ ์ ์ํด์ฃผ๋ ๋ฐฉ๋ฒ์ ๋ฐ๋ผ qs๋ฅผ ์ฌ์ฉํ์์ต๋๋ค.
* qs ์ค์น
: qs๋ querystring ํ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ด๋ฆฌ์ ๋ฆฌ(?) ๋ค๋ฃฐ ์ ์๊ฒ ํด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
yarn add qs
query parameter์ ๊ฐ์ location์์ ๋ฐ์๋ณผ ์ ์์ต๋๋ค.
- Info.js
import qs from 'qs'
// ๋ชฉ์
๋ฐ์ดํฐ
const data = {
user1: {
name: 'ํ๊ธธ๋',
detail: 'hong gill dong detail'
},
user2: {
name: '๊น๋๋ฆฌ',
detail: 'kim dool li detail'
}
}
const Info = ({ location }) => {
// location ์์ ๋ฐ์
const query = qs.parse(location.search, {
ignoreQueryPrefix: true // url ์์ ์์ ? ๋ฅผ ignoreํจ
})
const queryCheck = data[query.userid];
return (
<div>
This is info Page! <br/>
{
queryCheck &&
<p>{queryCheck.userid}</p>
}
</div>
)
}
export default Info
์ด๋ ๊ฒ ์ ๋ฆฌํด ๋๋ ๊ดํ ๋ฟ๋ฏํฉ๋๋ค. โจ