๋ฆฌ์กํธ๋ก ํ๋ก์ ํธ๋ฅผ ์์ํ ๋ ๋ณดํต ๋ฌด์กฐ๊ฑด ์ค์นํ๊ณ ์์ํ๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค.
์ด๋ฅผ ๋ฏธ๋ฆฌ ์ ๋ฆฌํด ๋๋ฉด ํธ๋ฆฌํ ๊ฒ ๊ฐ์ ์์ฑํด๋ด ๋๋ค.
๋ฆฌ์กํธ ์ฌ์ฉ์๋ค์ ๋๋ถ๋ถ ์๋ ๋ด์ฉ์ผ ๊บผ๋ผ ์๊ฐ๋ฉ๋๋ค๋ง,
ํน์ ๋ฆฌ์กํธ๋ฅผ ์ด์ ๋ง ์์ํ์๋ ๋ถ๋ค์ ๋์์ด ๋์ค๊บผ๋ผ ์๊ฐ๋ฉ๋๋ค.
์ ๊ฐ ์์ฑํ๊ณ ์ ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Router, Polyfill, Axios, Redux ์ ๋๋ค.
์์ผ๋ก ๋ฆฌ์กํธ์ ๊ด๋ จ๋ ์ ๋ณด๊ธ์ ์์ฑํ๋ฉด์ ์ข ๋ ์ธ์ธํ๊ฒ ๋ค๋ฃจ๊ฒ ์ง๋ง,
์ฐ์ ์ ์ด๋ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ์ง๋ ์์์ผ ํ๋, ๊ธฐ๋ณธ์ ์ธ ์ฌ์ฉ ๋ฐฉ๋ฒ๊ณผ ์ค๋ช ์ ๊ฐ์ด ์ ์ด ๋์์ต๋๋ค. ๐
1. Router
๋ผ์ฐํฐ๋ ์ฃผ์์ ๋ฐ๋ผ ๋ถ๋ถ ๋ ๋๋ง์ ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
SPA์์ ํ์ด์ง ์ด๋์ ๊ตฌํํ๋ฉด ๊ฑฐ์ ํ์๋ผ๊ณ ์๊ฐํ์ ๋ ๋ฌด๋ฐฉํฉ๋๋ค.
์๋ ๋ฐฉ์ ์ฒ๋ผ ์ ์ฒด ํ์ด์ง๋ฅผ ์ ํํ๊ณ ๋ฆฌ์์ค๋ฅผ ๋ค์ ๋ค์ด ๋ฐ์ง ์๊ณ , ๋ฏธ๋ฆฌ ๋ฐ์๋์๋ ๋ฆฌ์์ค๋ค์ ์ฃผ์์ ๋ฐ๋ผ ๋ถ๋ถ ์ ์ผ๋ก ๋ณ๊ฒฝํด ์ฃผ๋ ๊ฑฐ๋ผ๊ณ ๋ณด์๋ฉด ๋ฉ๋๋ค.
npm install react-router-dom --save
import {
BrowserRouter as Router,
Switch,
Route,
Link
} from "react-router-dom";
function App() {
return (
<Router>
<div>
<Link to="/about">About</Link>
<Link to="/service">Service</Link>
<Link to="/qna">Qna</Link>
<hr />
<Switch>
<Route exact path="/" component={Main} />
<Route exact path="/about" component={About} />
<Route exact path="/service" component={Service} />
<Route exact path="/qna" component={Qna} />
</Switch>
</div>
</Router>
);
}
์ฌ์ฉ ๋ฐฉ๋ฒ์ ์ฌ์ค ํ๋ก์ ํธ์ ๋ฐ๋ผ ๋ค๋ฅด์ง๋ง, ์ด๊ฒ ์๋ง ๋ค๋ค ์ฌ์ฉํ๋ ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์กฐ์ผ๊ป๋๋ค.
Link ํ๊ทธ์ url ์ฃผ์๋ฅผ ๋ฃ๊ณ , ํด๋น ๋งํฌ๋ฅผ ํด๋ฆญํ๋ฉด ํ๋จ์ Route์ path์ ๋น๊ตํ์ฌ ์ปดํฌ๋ํธ๋ฅผ ๋ฟ๋ ค์ค๋๋ค.
์์ฃผ ๊ฐ๋จํ์ง์? ๋ผ์ฐํธ์์ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ณด๋ผ ์๋ ์์ผ๋ฉฐ, ์์ฃผ ์ ์ฉํฉ๋๋ค.
2. Polyfill
๋ฆฌ์กํธ๋ ES6๋ฌธ๋ฒ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ IE์์๋ ์๋์ด ์๋๋ ๋ฌธ๋ฒ์ด ๋ง์ต๋๋ค.
์๋น์ค ํ๊ฒฝ์ด ie์ ๊ตญํ๋์ด ์์ง ์๋ค๋ฉด ์๊ด ์์ง๋ง, ํ๊ตญ์์๋ ie ์๋น์ค๋ฅผ ์ํ๋ ํ๋ก์ ํธ๋ฅผ ์ฐพ๊ธฐ ํ๋ค์ง์.
์ ๋ง ํ๋ก์ ํธ ํ ๋ ๋ง๋ค ํ๊ฐ ๋์ IE์ฌ์ฉ์ ๋ฒ์ ์ผ๋ก ๊ธ์งํ์ผ๋ฉด ์ข๊ฒ ๋ค๋ ๋ง๋ ์๋๋ ์์์ ํ๊ธฐ๋ ํ์ต๋๋ค. ๐
์๋ฌดํผ ํด๋ฆฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ชจ๋ ๊ฒ์ ๋ฐ์์ฃผ๋ ๊ฒ์ ์๋๋๋ค.
ํด๋ฆฌํ ์ข ๋ฅ๋ ๋ง๊ณ ์ฌ์ฉํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ง๋ค ์ถ๊ฐ๋ก ์ง์ํด ์ฃผ๋ ๊ฒ๋ ์์ผ๋, ์ด๋ ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๋์๋ ๋ธ๋ผ์ฐ์ ํธํ์ฑ๋ ์ดํด ๋ณด์๊ธฐ ๋ฐ๋๋๋ค.
๊ทธ๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ค์นํด ์ค๋๋ค. ์ค์น ์ํ๋ฉด ์์ IE ์์๋ ์๋์๊ฐ๋๋ค.
์ด๋ฏธ ์ค๋์ ์ ๋ฆฌ์กํธ๊ฐ ๊ณต์์ ์ผ๋ก IE๋ฅผ ๋ฒ๋ ธ๊ฑฐ๋ ์.
npm install react-app-polyfill
ํน์ ํ๋ก์ ํธ ์ค๊ฐ์ ์ค์น ํ๊ฒ๋๋ฉด ์ ๋๋ก ๋์์ด ์๋๋ ๊ฒฝ์ฐ๋ ์๋ค๊ณ ํฉ๋๋ค.
๊ทธ๋ด๋๋ react-app-polyfill ์ค์น ํ ์บ์์ญ์ ํ๊ณ ์ฌ์คํ ํด์ฃผ์ธ์.
์บ์ ์ญ์ ๋ node_modules/.cache ๋๋ ํฐ๋ฆฌ ์ญ์ ํ๋ฉด ๋ฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ Polyfill ์ฌ์ฉ์ ํ๋ ค๋ฉด ๋ฃจํธ์ ์๋ index.js ํ์ผ์ import ํด์ผํฉ๋๋ค.
// IE9์ ๊ฒฝ์ฐ
import 'react-app-polyfill/ie9';
import 'react-app-polyfill/stable';
// IE11์ ๊ฒฝ์ฐ
import 'react-app-polyfill/ie11';
import 'react-app-polyfill/stable';
๊ทธ๋ฆฌ๊ณ package.json ํ์ผ์์๋ ์ถ๊ฐํด ์ฃผ์ธ์.
"browserslist": {
"production": [
">0.2%",
"not dead",
"not op_mini all"
],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version",
"ie 11" // <- ์ถ๊ฐ
]
}
๊ทธ๋ฆฌ๊ณ npm start ๋ฅผ ํ๋ฉด ๊ทธ๋๋ ํ๋ฉด์ด ๋์ค์ง ์์ต๋๋ค.
์ด๋ ์ฌ์ค ์ ๋ ์ ํํ๊ฒ ์๋๊ฒ์ด ์๋๋๋ค.
build ์์๋ง ์ ์ฉ์ด ๋๋ค๋ ๋ง์ด ์์ด์, build๋ฅผ ํด๋ณด์์ต๋๋ค.
( ํน์ ์์๋ ๋ถ ๋๊ธ ๋จ๊ฒจ์ฃผ์ธ์! )
npm run build
npx serve -s build
build ์ดํ ์๋ ํ๋ฉด์ด ์ ๋น๋๋ค.
3. Axios
axios๋ ๋น๋๊ธฐ ํต์ ์ ์ฌ์ฉ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก http ํต์ ์ ํด์ผํ๋ค๋ฉด ๊ฑฐ์ ํ์์ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
APIํต์ ์ ์ํ request์ response ์ฌ์ด์์ interceptor๋ฅผ ํตํ ์ฒ๋ฆฌ๋ ์ฝ๊ฒ ํ ์ ์๊ณ , Pomise๋ฅผ ์ง์ํ๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ๊ธฐ ์ฉ์ดํฉ๋๋ค. ๊ฐ์ธ์ ์ผ๋ก ๊ธฐ์กด ajax๋ณด๋ค๋ ํจ์ฌ ์ฌ์ฉํ๊ฒ ํธํฉ๋๋ค.
npm install axios --save
axios๋ ์ํฉ์ ๋ฐ๋ผ ๋ค์ํ ํจํด์ด ์ฌ์ฉ๋ฉ๋๋ค.
๊ธฐ๋ณธ ๊ตฌ์กฐ๋ ์ด๋ฌํ๋ฉฐ, ์ฌ์ฉ์ finally๋ ๊ผญ ์ฌ์ฉํ์ง ์์๋ ๋ฉ๋๋ค.
axios.get('your url')
.then(response => {
console.log("response => ", response);
})
.catch(error => {
console.log("Error => ", Error);
})
.finally(() => {
console.log("The End!");
})
4. Redux (ํ์์๋)
๋ฆฌ์กํธ์์ ์ํ์ ๋ณํ๋ฅผ ๊ด๋ฆฌํ๊ธฐ๋ ์ฐธ ๋ฒ๊ฑฐ๋กญ์ต๋๋ค.
์ด๋ฐ ์คํฐ๋ ํ ๋์๋ ๋ณ๋ก ํ๋ค์ง ์์๋ฐ? ๋ผ๊ณ ์๊ฐํ๋ค๊ฐ, ๋ณต์กํ ํ๋ก์ ํธ์์ ์ํ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ด props์ ๋ฏธ์น๋ฏ์ด ์ฃผ๊ณ ๋ฐ์ ๊ณค์์ ์น๋ฅธ์ ์ด ์์ต๋๋ค.
์ฌ์ค ์ ๋ ๋ฆฌ์กํธ๋ฅผ ์์ง ๊ณต๋ถํ๊ณ ์๋ ๋จ๊ณ์ ๋๋ค๋ง, ๋ฆฌ๋์ค๋ ์ฐธ ์ด๋ ต์ต๋๋ค.
๋น๋๊ธฐ ํต์ ์ด ์์๋๋ฉด์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋๋ฌด ๋ง๊ณ ์ํฉ์ ๋ฐ๋ผ ์ฌ์ฉ๋๋ ํจํด๋ค๋ ๋์ด๋์ ์ ๋ง ํ์ํ ๋ถ๋ถ์ ๊ฒ์ํด์ ์ฌ์ฉํ๊ธฐ ํ๋ค๋๋๋๋ค.. [๊ทธ๋ฅ ์ ๊ฐ ์ค๋ ฅ์ด ๋ถ์กฑํด์๐ฅ]
์ ๋ฆฌํ์๋ฉด, ์ด๋ณด์์๊ฒ๋ ์ง์ ์ฅ๋ฒฝ์ด ๋์ ํธ์ ๋๋ค.
๊ตณ์ด ์ฌ์ฉํ์ง ์์๋ ๋๋ ์๊ท๋ชจ ํ๋ก์ ํธ์๋ ๊ทธ๋ฅ props์ผ๋ก๋ง ๊ด๋ฆฌ๋ฅผ ํ๊ฑฐ๋ react์์ฒด์์ ์ ๊ณต๋๋ useContext๋ฅผ ์ฌ์ฉํ์๊ธธ ์ถ์ฒ๋๋ฆฝ๋๋ค. ํ์ง๋ง ๋ถ๋ช ๋ฆฌ๋์ค์ ๊ฐ์ ์ด ์์ผ๋ฏ๋ก, ์ด์จ๋ ์ฌ์ฉํด์ผ ํ ๋๊ฐ ์๊ฒ ์ง์?
npm install redux react-redux redux-promise redux-thunk --save
npm install redux-devtools-extension
์ ๋ ์ฃผ๋ก ์ด๋ ๊ฒ ํ๊บผ๋ฒ์ ์ค์นํ๋ ํธ์ ๋๋ค.
- redux๋ ๋ฆฌ๋์ค ์์ฒด์ ๋๋ค.
- react-redux๋ ๋ฆฌ์กํธ์์ ๋ฆฌ๋์ค๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ์ค๊ฐ ์ญํ์ ํด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ผ๊ณ ์๊ฐ ํ์๋ฉด ๋ฉ๋๋ค.
์ฆ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ ์ ์ด๋ค์.
- redux-promise ๋ promise๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ๋๋ค.
- redux-thunk๋ function์ฆ ๊ฐ์ฒด ๋์ ํจ์ ํํ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ๋๋ค.
redux-promise์ redux-thunk๋ ๋ฏธ๋ค์จ์ด๋ฅผ ํตํด ์ฌ์ฉ๋ฉ๋๋ค.
- redux-devtools-extension ์ ๊ตฌ๊ธ ํ์ฅ์ฑ์ ์ฌ์ฉํ๊ธฐ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๋ฆฌ๋์ค ์ฌ์ฉ์ state์ action์ ์ค์๊ฐ ๊ฐ์งํ ์ ์๋ ์ ์ฉํ ์ฑ์ ๋๋ค. ํ์ํ์ง ์๋ค๋ฉด ์๋ตํด๋ ๋์ง๋ง, ๋ฆฌ๋์ค ์ฌ์ฉํ ๋๋ ๊ถ์ฅํฉ๋๋ค.
๋ฃจํธ์ธ index.js ํ์ผ์ ๋ค์๊ณผ ๊ฐ์ด ์์ฑ ํด ์ค๋๋ค.
import { Provider } from 'react-redux';
import { applyMiddleware, createStore } from 'redux';
import promiseMiddleware from 'redux-promise';
import ReduxThunk from 'redux-thunk';
import Reducer from './_reducers'
const createStoreWithMiddleware = applyMiddleware(promiseMiddleware, ReduxThunk)(createStore);
ReactDOM.render(
<Provider
store={createStoreWithMiddleware(Reducer,
window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__() // redux devtool ๋๋ฌธ์ ๋ฃ์
)}
>
<App />
</Provider>,
document.getElementById('root')
);
์ดํ ์คํ ์ด, ๋ฆฌ๋์, ์ก์ ์ ์์ฑํ ๋ค ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
์ด๋ ๋ด์ฉ์ด ์กฐ๊ธ ๊ธธ์ด์ง ๊ฒ ๊ฐ์ ์์ฃผ ๊ฐ๋จํ ์์๋ง ๋ค๊ฒ ์ต๋๋ค.
// ์ก์
ํ์
const ADD = 'add';
// ์ก์
์์ฑ ํจ์
export const add = () => ({ type: ADD })
// ์ด๊ธฐ ์ํ
const initialState = {
number: 0
}
// ๋ฆฌ๋์
function add(state=initialState, action) {
switch(action.type){
case ADD:
return { number: state.number + 1 }
default:
throw new Error(`Unable action type ${action.type}`)
}
}
export default MyRedux;
์ด๋ฐ์์ผ๋ก ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
๋ฆฌ๋์ค๋ ์ฌ์ฉํ๋๋ฐ ์์ด์ ๋ง์ ํ์ต์ด ํ์ํฉ๋๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ค์ํ๊ฒ ๋์ค๊ณ ์์ผ๋ฏ๋ก, ๊ด์ฌ์์ผ์ ๋ถ๋ค์ redux-toolkit, redux-saga ๋ ๊ฐ์ด ์ฐพ์๋ณด์ธ์!
์ด ์ธ์๋ uuid, cookie, chart, datepicker ๋ฑ๋ฑ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ด ์์ฃผ ๋ง์ต๋๋ค.
๊ทธ ์ค ๋ฆฌ์กํธ๋ก ์์ํ๋ค๋ฉด, ์๊ท๋ชจ ํ๋ก์ ํธ๋ ํํ ์ค์นํ๋ฉด ์ข์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ์๊ฐ ํ์ต๋๋ค. ( redux๋นผ๊ณ )
ํ๋ก ํธ ์์ญ์ ์ ๋ง ๋น ๋ฅด๊ฒ ๋ฐ์ ํ๊ณ ์์ด, ํ์ตํ๋ฉฐ ๋ฐ๋ผ๊ฐ๊ธฐ ์ ๋ง ํ๋ญ๋๋ค.
์๋ก์ด ์ธ์ด๋ ํจํด์ด ๋์ฌ์๋ก ์ ๋ง ๊ธฐ๋ณธ์ ํผํผํ๊ฒ ๊ณต๋ถํด์ผ ํ๋ค๋ ๊ฑธ ๋ง์ด ๋๋๋ต๋๋ค.
๊ทธ๋ผ ์ค๋๋ ์ฆ๊ฑฐ์ด ์ฝ๋ฉ ํ์ธ์~๐ฅฐ
'๊ฐ๋ฐ ๐พ > ReactJS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React][ํ๊ฒฝ์ธํ ] react-router-dom ์ฌ์ฉํ๊ธฐ (0) | 2021.05.25 |
---|---|
[์๋ฌ๋ ธํธ] defaultState for reducer handling [object Object] should be defined (0) | 2021.03.17 |
React Hook ์์ Scroll ์ปจํธ๋กค ํ๊ธฐ! top๋ฒํผ ๊ตฌํ (1) | 2021.02.09 |
React-datepicker ์ปค์คํ ํ๊ธฐ (2) | 2021.02.02 |
React ์คํ์ผ๋ง - emotion (3) | 2021.02.01 |