react-router๋ฅผ ํตํ ๋ฆฌ์กํธ ์ฑ๊ธํ์ด์ง ๋ง๋ค๊ธฐ / ํด๋ ๊ตฌ์กฐ
ํด๋ ๊ตฌ์กฐ
์ด๊ฒ์ด ํ์๋ ์๋.
๋ณธ์ธ ์ทจํฅ๊ป ๋ค์ํ ํด๋๊ตฌ์กฐ ์๋๋ฅผ ํด๋ณด๋ ๊ฒ์ด ์ข์.
- ํ์ด์ง๋ ํ์ด์ง์ด๋ค.
- ํ์ด์ง๊ฐ ๊ฒ์๋๋ ๊ตฌ์ฑ์ layouts
- ์ปค์คํ ํ ์ hooks, ๊ธฐํ๋utils
- ๊ฐ ์ปดํฌ๋ํธ๋ ์ปดํฌ๋ํธ ํด๋ ์๋ index.tsx(JSX)์ styles.tsx(์คํ์ผ๋ง)
App.tsx>
import React from 'react';
import {Switch, Route, Redirect} from 'react-router-dom';
import LogIn from '@pages/Login';
import SignUp from '@pages/SignUp';
const App = () => {
return <Switch>
<Redirect exact path="/" to ="/login"/>
<Route path="/login" component={LogIn}/>
<Route path="/signup" component={SignUp}/>
</Switch>
};
export default App;
Switch ๋?
์ฌ๋ฌ๊ฐ์ง ์ ํ์ง ์ค์ ํ๋๋ง ์ ํํ ์ ์๋ ๊ฒ.
3๊ฐ์ง route์ค์ ํ๋๋ง ์ ํ ๋์ด์ผ ํจ.
Redirect๋?
๋ค๋ฅธ ํ์ด์ง๋ก ๋๋ ค ์ฃผ๋ ๊ฒ.
์ฃผ์๊ฐ '/' ๋ก ๋๋๋ฉด login์ผ๋ก ํ์ด์ง๋ฅผ ๋๊ฒจ์ค.
SPA์์ ํ์ด์ง ๋๊ธฐ๋ ๋ฐฉ๋ฒ
โSPA ๋?
- Single Page Application (์ฑ๊ธ ํ์ด์ง ์ดํ๋ฆฌ์ผ์ด์ )์ ์ฝ์์ด๋ค. ๋ง ๊ทธ๋๋ก, ํ์ด์ง๊ฐ 1๊ฐ์ธ ์ดํ๋ฆฌ์ผ์ด์ ์ด๋ ๋ป์ด๋ค. ์ ํต์ ์ธ ์ท ์ดํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์กฐ๋, ์ฌ๋ฌ ํ์ด์ง๋ก ๊ตฌ์ฑ๋์ด ์๋ค. ์ ์ ๊ฐ ์์ฒญํ ๋๋ง๋ค ํ์ด์ง๊ฐ ์๋ก๊ณ ์นจ ๋๋ฉฐ, ํ์ด์ง๋ฅผ ๋ก๋ฉํ ๋๋ง๋ค ์๋ฒ๋ก๋ถํฐ ๋ฆฌ์์ค๋ฅผ ์ ๋ฌ๋ฐ์ ํด์ ํ ๋ ๋๋ง์ ๋งํ๋ค. htmlํ์ผ, ํน์ ํ ํ๋ฆฟ ์์ง ๋ฑ์ ์ฌ์ฉํด์ ์ดํ๋ฆฌ์ผ์ด์ ์ ๋ทฐ๊ฐ ์ด๋ป๊ฒ ๋ณด์ฌ์ง์ง๋ ์๋ฒ์์ ๋ด๋นํ๋ค.
์ฑ๊ธํ์ด์ง๋ผ๊ณ ํด์, ํ ์ข ๋ฅ์ ํ๋ฉด๋ง์ด ์๋ ๊ฒ์ด๋?
์๋๋ค. ์๋ฅผ ๋ค์ด, ๋ธ๋ก๊ทธ๋ฅผ ๋ง๋ ๋ค๋ฉด, ํ, ํฌ์คํธ ๋ชฉ๋ก, ํฌ์คํธ, ๊ธ์ฐ๊ธฐ ๋ฑ์ ํ๋ฉด์ด ์๋ค.
์ด๋ฐ ์์ผ๋ก ๋ค๋ฅธ ์ฃผ์์ ๋ฐ๋ผ ๋ค๋ฅธ ๋ทฐ๋ฅผ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ '๋ผ์ฐํ '์ด๋ผ๊ณ ํ๋ค.
์ด๊ฒ์ด ๋ฆฌ์กํธ ์์ฒด์๋ ์ด ๊ธฐ๋ฅ์ด ๋ด์ฅ๋์ด์์ง ์๋๋ค.
๋ฐ๋ผ์ ์ฐ๋ฆฌ๊ฐ ์ง์ ๋ธ๋ผ์ฐ์ ์ api๋ฅผ ์ฌ์ฉํ๊ณ ์ํ๋ฅผ ์ค์ ํ์ฌ ๋ค๋ฅธ ๋ทฐ๋ฅผ ๋ณด์ฌ์ฃผ์ด์ผ ํ๋ค.
react-router๋, ์จ๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก์, ๋น๋ก ๊ณต์์ ์๋์ง๋ง, ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๊ณ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ด๋ค.
์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํด๋ผ์ด์ธํธ ์ฌ์ด๋์์ ์ด๋ค์ง๋ ๋ผ์ฐํ ์ ๊ฐ๋จํ๊ฒ ํด์ค๋ค.
๊ฒ๋ค๊ฐ ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง๋ ๋์์ฃผ๋ ๋๊ตฌ๋ค์ด ํจ๊ป ๋ธ๋ ค์จ๋ค.
์ถ๊ฐ์ ์ผ๋ก ์ด ๋ผ์ฐํฐ๋ react-native์์๋ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
react-router๋ ์ค์น๋์ด ์๋ค๋ ๊ฐ์ ํ์,
์๋๋ ๊ทธ๊ฒ์ ์ค์ ํ๋๋ก ๋์์ฃผ๋ ๊ฒ
webpack.config.ts>
devServer: {
historyApiFallback: true, // react router
์ฌ๊ธฐ์ historyApiFallback ์ true๋ก ์ค์ ํด๋๋ฉด,
์ฃผ์ ๋ค์ ๊ฐ์ง ์ฃผ์(Login, Signup) ์ ๋ ฅํด์ค๋ค.
์ด ์ฃผ์๋ ์๋ฒ๋ก ๊ฐ๋ค.
Ligin/index.tsx>
import React from 'react';
const LogIn =()=>{
return(
<div>๋ก๊ทธ์ธ</div>
);
}
export default LogIn;
SPA ์ ๋จ์
SPA์ ๋จ์ ์, ์ฑ์ ๊ท๋ชจ๊ฐ ์ปค์ง๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ ์ฌ์ด์ฆ๊ฐ ๋๋ฌด ์ปค์ง๋ค๋ ๊ฒ์ด๋ค.
์ ์ ๊ฐ ์ค์ ๋ก ๋ฐฉ๋ฌธํ์ง ์์์๋ ์๋ ํ์ด์ง์ ๊ด๋ จ๋ ๋ ๋๋ง ๊ด๋ จ ์คํฌ๋ฆฝํธ๋ ๋ถ๋ฌ์ค๊ธฐ ๋๋ฌธ์ด๋ค.
ํ์ง๋ง, Code Splitting์ ์ฌ์ฉํ๋ค๋ฉด, ๋ผ์ฐํธ ๋ณ๋ก ํ์ผ๋ค์ ๋๋ ์ ํธ๋ํฝ๊ณผ ๋ก๋ฉ์๋๋ฅผ ๊ฐ์ ํ ์ ์๋ค.
๋ฆฌ์กํธ ๋ผ์ฐํฐ ๊ฐ์ด ๋ธ๋ผ์ฐ์ ์ธก์์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ผ์ฐํธ๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒ์ ์ ์ฌ์ ์ธ ๋จ์ ์,
์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ์ง ์๋ ์ผ๋ฐ ํฌ๋กค๋ฌ์์ ํ์ด์ง์ ์ ๋ณด๋ฅผ์ ๋๋ก ๋ฐ์๊ฐ์ง ๋ชปํ๋ค๋ ์ ์ด๋ค.
๋๋ฌธ์, ๊ตฌ๊ธ, ๋ค์ด๋ฒ, ๋ค์ ๋ฑ ๊ฒ์์์ง์์ ํ์ด์ง๊ฐ ๊ฒ์๊ฒฐ๊ณผ์์ ์ ์ํ๋ ์๋ ์๋ค. ์ถ๊ฐ์ ์ผ๋ก, ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋ ๋๊น์ง ํ์ด์ง๊ฐ ๋น์ด์๊ธฐ ๋๋ฌธ์, ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ด ์์ง ์บ์ฑ๋์ง ์์ ์ฌ์ฉ์๋ ์์ฃผ ์งง์ ์๊ฐ๋์ ํฐ ํ์ด์ง๊ฐ ๋ํ๋ ์๋ ์๋ค๋ ๋จ์ ๋ ์๋ค. ์ด๋, ์๋ฒ์ฌ์ด๋ ๋ ๋๋ง์ ํตํ์ฌ ํด๊ฒฐ ํ ์ ์๋ค.