
1. SPA์ ๋ผ์ฐํฐ์ ๊ด๊ณ
• SPA๋ ์๋ฒ์ ํ๋์ ํ์ด์ง๋ง ์์ฒญํ์ฌ ์ ์ฒด ์น์ฑ์ ์ฌ์ฉํ๋๋ฐ, ์ด๋ ๋ฆฌ์กํธ ๋ผ์ฐํฐ๋ CSR, AJAX ๊ธฐ์ ์ ํ์ฉํ์ฌ, ํ์ด์ง ์ด๋ ์ ๋ฆฌ๋ก๋ ์์ด ๋ผ์ฐํ ํ ์ ์๋๋ก ํ๋ค.
• MPA์ ๋ค๋ฅด๊ฒ, ์ฌ๋ฌ ํ์ด์ง๋ฅผ ํ๋์ ์ฑ์ ๊ตฌ์ฑ์์๋ก ๋ณด๊ณ , ์ฌ๋ฌ ํ์ด์ง ๊ฐ์ ์คํ์ผ, ์ปดํฌ๋ํธ๋ฅผ ์ฌํ์ฉํ์ฌ ๊ตฌํํ๋ค.
• ์๋ฐ์คํฌ๋ฆฝํธ๋ง์ ํ์ฉํด ์ ์ฒด ํ์ด์ง๋ฅผ ๋ง๋ค๊ธฐ์, ์ฒซ ์์ฒญ ์ ๋น ํ์ด์ง๋ฅผ ๋ฐ๊ฒ ๋๋ฉฐ, ์๋ฒ๋ก ๋ถํฐ ๋ฐ์ดํฐ๋ง ๋ฐ์์จ๋ค.
SPA์ ๊ธฐ์ ์ ์ฅ์
• ์๋ฒ์์ ํ์ด์ง๋ฅผ(์๋ฒ ๋๋๋ง) ๋ง๋ค ํ์๊ฐ ์์ผ๋ฏ๋ก CDN์ ์บ์ฑ์ด ๊ฐ๋ฅํ๋ค.
• ๋งค๋ฒ ํ์ด์ง ์์ฒญ์ ํ ํ์๊ฐ ์์ด ๋คํธ์ํฌ ์์ฒญ์ด ์ค์ด๋ ๋ค.
• ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฐ์ดํฐ ์์ฒญ ๋ฑ์ ์บ์ฑํ์ฌ ์ฌ์ฌ์ฉํ๋ ๋ฑ ์ ์ฝ ์กฐ๊ฑด์ด ์ค์ด๋ ๋ค.
• ์น์ฌ์ดํธ๋ฅผ ๊ฐ๋ณ ํ์ด์ง๋ณด๋ค๋ ํ๋์ ์ฑ์ผ๋ก ๋ณด๋ ์ค๊ณ๋ก ์ปดํฌ๋ ์ฌ์ฌ์ฉ, ๋ผ์ฐํ , ํ ์ ํตํ ๋ก์ง๋ฑ ๊ณ ๋์ ์ํํธ์จ์ด ์ค๊ณ์ ํจํด์ ์ ์ฉํ ์ ์๋ค.
SPA์ ๊ธฐ์ ์ ๋๊ด๋ค
• MPA๋ฐฉ์ ๋ณด๋ค๋ Search Engine Optimization์ ๋ถ๋ฆฌํ๋ค.
• ํ๋์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฑ์ด ์ง์ํ๋ฏ๋ก, ๋ฐ์ดํฐ ํ์ฉ๊ณผ ๋ฉ๋ชจ๋ฆฌ ์ฑ๋ฅ ๊ด๋ฆฌ๊ฐ ํ์ํ๋ค.
• ์ฌ๋ฌ ํ์ด์ง๋ฅผ ์ ์ก๋ฐ๋ ๊ฒ ๋ณด๋ค, ํ๋์ ๊ฑฐ๋ํ ์๋ฐ์คํฌ๋ฆฝํธ ์ฑ์ ์ ์ก๋ฐ์์ผ ํ๋ฏ๋ก ์ฝ๋๊ฐ ๋ง์์ง์๋ก ๋ก๋ ์๋๊ฐ ๋๋ ค์ง๋ค. ๋ฐ๋ผ์ ์ฝ๋ ์คํ๋ฆฟํ , ๋ ์ด์ง ๋ก๋ฉ ๋ฑ์ ํตํด ๋ณด์์ ํด์ผํ๋ค.
MPA ๋?
• Multi Page Application์ ์๋ฒ์ ๋ฏธ๋ฆฌ ์ฌ๋ฌ ํ์ด์ง๋ฅผ ๋๊ณ , ์ ์ ๊ฐ ๋ค๋น๊ฒ์ด์ ์ ์์ฒญ์ ์ ํฉํ ํ์ด์ง๋ฅผ ์ ๋ฌํ๋ค.
• ๋ฏธ๋ฆฌ ์๋ฒ์์ ์ ์ฒด ํ์ด์ง๋ฅผ ๋น๋ํด ๋ธ๋ผ์ฐ์ ๋ก ์ ์ก๋๋ค.
• ์๋ฒ์ ๋ผ์ฐํ ์ ์ฒ๋ฆฌํ๋ ๊ธฐ๋ฅ์ด ์๊ณ , ์๋ฒ์์ ์ฌ๋ฌ ํ์ด์ง๋ฅผ ๊ด๋ฆฌํ๋ค.
• ํ์ด์ง ์์ฒญ๋ง๋ค ๋ชจ๋ ๋ฆฌ์์ค๋ฅผ ๋ค์ ๋ฐ์์ค๋ฏ๋ก, ํ์ด์ง ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฌํ์ฉํ๊ธฐ ํ๋ค๋ค.
SPA์์์ ๋ผ์ฐํ
• ์ฃผ๋ก HTML5์ History API (ํน์ URL Hash)๋ฅผ ์ด์ฉํด ํ์ด์ง ๋ฆฌ๋ก๋ ์๋ ํ์ด์ง ์ ํ์ ๊ตฌํํ๋ค
• hashRouter: URL์ #๊ฐ ๋ถ๋๋ค. ํ์ง๋ง github page๊ฐ์ ๊ณณ์์ ๋น๋ํ ๋ ์ ๋ฆฌํ๋ค
• history, location ๋ฑ HTML5 API๋ฅผ ํ์ฉํ๋ค.
• visibilitychange, popstate, beforeunload ๋ฑ window event๋ฅผ ํ์ฉํ์ฌ ํ์ด์ง ์ ํ ์ด๋ฒคํธ ์ ํธ๋ค๋ฌ๋ฅผ ๋ฑ๋กํ์ฌ ํ์ฉํ๋ค.
• react-router, reach-router ๋ฑ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํ๋ฉด, ๋ผ์ฐํ ๊ด๋ จ ๊ธฐ๋ฅ์ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋ค.
2. react-router
• React์ JSX๋ฅผ ์ด์ฉํ๊ฑฐ๋, History API๋ฅผ ์ฌ์ฉํ์ฌ ๋ผ์ฐํ ์ ๊ตฌํํ๋ค.
• Declarative routing ๋ฐฉ๋ฒ: JSX: <Link to ="/path"></Link>
• Imperative routing ๋ฐฉ๋ฒ: History API: push('/path')
• ์น์์๋ react-router-dom์ ์ฌ์ฉํ๋ค. (react-router-native)
• ์ ์ฉ ์, ์๋ฒ์ ๋ชจ๋ path์์ ๊ฐ์ ์ฑ์ ์๋นํ๋๋ก ํด์ผ ํ๋ค.
3. react-router-dom ์ฌ์ฉํ๊ธฐ
• <BrowserRouter>๋ก ๊ฐ์ธ Router Context๋ฅผ ์ ๊ณตํด์ผ ํ๋ค.
• Route๋ก path๋ฅผ ์ ์ํ๊ณ , ๊ทธ ์์ ๋ ๋๋งํ๊ณ ์ ํ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ฃ๋๋ค.
• Link๋ก ํน์ ํ์ด์ง๋ก ์ด๋ ์, ๋ฆฌ๋ก๋ ์์ด ํ์ด์ง๊ฐ ์ด๋ํ๋ค.
• Switch๋ก, ๋งค์นญ๋๋ ๋ผ์ฐํธ ํ๋๋ฅผ ๋ ๋๋งํ๊ฒ ํ๋ค.
1) BrowserRouter
• HTML5์ History API๋ฅผ ์ฌ์ฉํ์ฌ, UI์ URL์ ์ฑํฌ๋ฅผ ๋ง์ถ๋ ์ญํ ์ ํ๋ค.
• ๋ชจ๋ URL์ ๋ํด ๋์ํ๊ฒ ํ๊ธฐ ์ํด์๋ ์๋ฒ ์ค์ ์ด ํ์ํ๋ค.
• ๋ชจ๋ path ์์ basename์ ์ง์ ํ ์ ์๋ค. ex) basename="/ko" ๋ค๊ตญ์ด์ง์
• forceRefresh๋ก, ํ์ด์ง ์ด๋ ์ ๋ฆฌํ๋ ์ํ ๊ฒ์ธ์ง ์ง์ ํ ์ ์๋ค.
<BrowserRouter>
<Switch>
<Route path="/about"><AboutPage/></Route>
<Route path="/contact"><ContacPage/></Route>
<Route path="/"><HomePage/></Route>
</Switch>
</BrowserRouter>
2) Link, NavLink, Redirect
Link
• Link ์ปดํฌ๋ํธ๋ ํด๋ฆญํ๋ฉด ๋ค๋ฅธ ์ฃผ์๋ก ์ด๋์ํจ๋ค.
• ๋ฆฌ์กํธ ๋ผ์ฐํฐ๋ฅผ ์ฌ์ฉํ ๋ <a> ํ๊ทธ ๋์ <Link> ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํด์ผํ๋ค. a ํ๊ทธ์ ๊ธฐ๋ณธ์ ์ธ ์์ฑ์ ํ์ด์ง๋ฅผ ์ด๋์ํค๋ฉด์, ํ์ด์ง๋ฅผ ์์ ์๋ก ๋ถ๋ฌ์ค๊ธฐ ๋๋ฌธ์, ๋ฆฌ์กํธ ์ฑ์ด ์ง๋๊ณ ์๋ ์ํ๋ค๋ ์ด๊ธฐํ๋๊ณ , ๋ ๋๋ง๋ ์ปดํฌ๋ํธ๋ ๋ชจ๋ ์ฌ๋ผ์ง๊ณ ์๋ก ๋ ๋๋ง์ ํ๊ฒ๋๋ค.
• <Link> ์ปดํฌ๋ํธ๋ HTML5 History API ๋ฅผ ์ฌ์ฉํ์ฌ ๋ธ๋ผ์ฐ์ ์ ์ฃผ์๋ง ๋ฐ๊ฟ๋ฟ, ํ์ด์ง๋ฅผ ์๋ก ๋ถ๋ฌ์ค์ง๋ ์๋๋ค.
NavLink
• to prop์ ํน์ URL๋ก ๋ฐ์, ํด๋ฆญ ์ ๋ค๋น๊ฒ์ด์ ํ๋ค.
• NavLink์ ๊ฒฝ์ฐ, ๋งค์นญ ์ ์ด๋ค ์คํ์ผ์ ๊ฐ์ง์ง ๋ฑ์ ์ถ๊ฐ ๊ธฐ๋ฅ์ด ์๋ค. (ํ์ฌ path์ ๋ฐ๋ผ ์คํ์ผ ์ ์ฉ ๊ฐ๋ฅ)
• to์ location object๋ ํจ์๋ฅผ ๋ฐ์ ์ ์๋ค.
Redirect
• Link์ ๋น์ทํ๋, ๋ ๋๋ง๋๋ฉด to prop์ผ๋ก ์ง์ ํ path๋ก ์ด๋ํ๋ค.
• Switch ์์์ ์ฐ์ผ ๊ฒฝ์ฐ, from, to๋ฅผ ๋ฐ์ ์ด๋ํ๊ฒ ๋ง๋ฆ. ex) from="/" to="/login"
<Link to="/about"><aboutPage></Link>
3) Route
<BrowserRouter>
<Navigation />
<Route path="/" exact={true}><Home /></Route>
<Route path="/about" component={About} />
<Route path="/movie/:id" render={(props) => props.id > 10 ? <Deatails> : ""} />
</BrowserRouter>
- ๋ผ์ฐํฐ๋ ์์ path๊ฐ ์์ผ๋ฉด ํธ์ถ๋๊ธฐ ๋๋ฌธ์ ์ค๋ณต๋๋ค.
- path์ ์ปดํฌ๋ํธ๋ฅผ ๋งค์นญํ๋ค.
- ๋งค์นญ๋๋ ์ปดํฌ๋ํธ๋ children์ผ๋ก ๋ฃ์ด์ฃผ๊ฑฐ๋, component prop์ผ๋ก ๋๊ธด๋ค.
- render prop์ผ๋ก ๋งค์นญ๋์์ ๋ ์ค์ ์ด๋ค ์ปดํฌ๋ํธ๋ฅผ ๋๋๋งํ ์ง ํต์ ํ ์ ์๋ค.
- Router๋ก ๋๋๋ง ๋๋ ์ต์์ ์ปดํฌ๋ํธ๋ match, location, history๋ฅผ prop์ผ๋ก ๋ฐ๋๋ค.
4) switch
• ์ฌ๋ฌ Route ์ค ๋งค์น๋๋ Route ์์์๋ถํฐ ํ๋๋ฅผ ์ ํํ์ฌ ๋ ๋๋งํ๋ค.
• ๋งค์นญ๋๋ Route๊ฐ ์์ผ๋ฉด ์๋ฌด๊ฒ๋ ๋ณด์ฌ์ฃผ์ง ์๋๋ค. fallback์ฉ์ผ๋ก 404 Not Found Page๋ฅผ ๋งจ ์๋์ ๋ฐฐ์นํ ์ ์๋ค
• path="/"์ ๊ฒฝ์ฐ ๋ชจ๋ path์ ๋งค์นญ๋๋ฏ๋ก exact ํค์๋๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ๊ฐ์ฅ ์๋๋ก ๋ด๋ฆฐ๋ค.
<Switch>
<Route exact path='/'>
<Home mbtiArray={mbtiArray} />
</Route>
<Route path='/chat'>
<Chat userObj={userObj} />
</Route>
<Route path='/profile'>
<Profile userObj={userObj} typeInit={typeInit} />
</Route>
<Route>
<Redirect to='/' />
</Route>
</Switch>;
5. useHistory, useLocation, useParams, useRouteMatch
• ์ต์์ ์ปดํฌ๋ํธ๊ฐ ์๋๋๋ผ๋, hook์ผ๋ก react-router ๊ด๋ จ ๊ฐ์ฒด์ ์ ๊ทผํ ์ ์์.
• history, location, params, match ๊ฐ์ฒด์ ์ ๊ทผํจ.
6. Private Router
• ํน์ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋์ง ์์์ ๋, ๋ค๋ฅธ ํ์ด์ง๋ก Redirect ํ๋๋ก ํ๋ ๊ธฐ๋ฅ์ด๋ค.
• ์ ์ ์ ์์ธ ํ์ด์ง, ๊ฐ์ธ์ ๋ณด ๋ณ๊ฒฝ ํ์ด์ง ๋ฑ์ ์ด๋ํ๋ ค๊ณ ํ ๋ ์ฌ์ฉํ๋ค.
Declartive ๋ฐฉ๋ฒ
function PrivateRoute({ component: Component, ...props }) {
return (
<Route
{...props}
render={(props) => {
const isLoggedIn = !!getUserInfo();
if (!isLoggedIn) {
return <Redirect to='/login' />;
}
return <Component {...props} />;
}}
></Route>
);
}
Imperative ๋ฐฉ๋ฒ
function usePrivateRoute(validateFunc) {
// imperative
const history = useHistory();
useEffect(() => {
if (!validateFunc()) {
history.push('/login');
}
}, []);
}
6. query string
function App() {
...
return (
<Link to='/contact?email=example@example.com&address=Seoul'>Contact</Link>
);
}
function ContactPage() {
const location = useLocation();
const searchParams = new URLSearchParams(location.search);
const email = searchParams.get('email'); // query์ key๊ฐ์ ์ด์ฉ
const address = searchParams.get('address');
return (
<PageLayout header='Contact Page'>
<em>{email}</em>
<br />
<strong>{address}</strong>
</PageLayout>
);
}
• URL์ query string ์ ๋ณด๋ฅผ ํ์ฉํด ์ฑ์ ๊ตฌ์ฑํ ์ ์๋ค.
• URLSearchParamsAPI, useLocation์ ํ์ฉํ๋ค.
'๐ Front > โ๏ธ React JS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [React Hook ์๋ฆฌ์ฆ 3]: 10๊ฐ์ง Hook๋ค (useMemo, useRef ๋ฑ) (0) | 2021.08.03 |
|---|---|
| [React Hook ์๋ฆฌ์ฆ 2]: useEffect() (0) | 2021.07.22 |
| [React Hook ์๋ฆฌ์ฆ 1]: ์ฐ๋ ์ด์ , useState() (0) | 2021.07.20 |
| [๋ฆฌ์กํธ ์ผ๋์ฅ]: Component, State, Props (0) | 2021.02.02 |
| [React ์ ๋ฌธ]: ์ฐ๋ ์ด์ , ํน์ง, CRA, CRA๊ตฌ์ถ (0) | 2021.01.26 |