Redux์ ๋ํด์ ๋ฐฐ์๋ณด์. ๋ฐ๋ก ๊ณ ๊ณ ! ๐๐ปโโ๏ธ
Redux๋ฅผ ์ฐ์ง์์ผ๋ฉด ์ด๋ค ๋ฌธ์ ์ ์ด ์์๊น?
์ ๋ฆฌํ์๋ฉด, Propsํํ๋ก State๋ฅผ ์ง์ ์์ ์ปดํฌ๋ํธ์๊ฒ ๋๊ฒจ์ ์ฌ์ฉํจ. ๊ทธ๊ฑธ ๋ ๋๊ธฐ๊ณ ...๋๊ธฐ๊ณ ..
๐๐ป ๋๋ฌด๋ ๋ณต์กํ๊ณ ๋ถํธํจ..
๊ทธ๋ผ Redux๋ฅผ ์ฌ์ฉํ๋ค๋ฉด?
Redux์ STORE๋ฅผ ์ฌ์ฉํ๊ฒ๋๋ฉด ์ง์ ์ ์ผ๋ก ๋ฐ์ดํฐ์ ์ ๊ทผํ๊ณ , ๋ณ๊ฒฝ ๋ํ STORE์ ์์ฒญํด์ ์ฌ ๋๋๋ง ๊ฐ๋ฅํ๊ธฐ์ ์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
DAO๋ฅผ ํ๋ ๋ง๋ค์ด ๋๊ณ ํน์ ๊ธฐ๋ฅ์ ์์ฒญํ๋ฉด ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฐฉ์์ ์๊ฐํ๋ฉด ์ฝ๋ค.
DAO๋?
DAO (Data Access Object)
- DB์ data์ ์ ๊ทผํ๊ธฐ ์ํ ๊ฐ์ฒด.
- DB์ ์ ๊ทผํ๋ ๋ก์ง์ ๋ถ๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ค.
- MVC ํจํด์์์ Model์ ์ญํ .
๊ทธ๋์ Redux ๋ํ DAO๋ ๋์ผํ๋ค.
์ง์ DB์ ์ ๊ทผํ์ฌ data๋ฅผ ์ฝ์ , ์ญ์ , ์กฐํ ๋ฑ ์กฐ์ํ ์ ์๋ ๊ธฐ๋ฅ์ ์ํํ ์ ์๋ ๊ฒ์ด๋ค.
์ปดํฌ๋ํธ์ ์ํ๊ฐ ๋ณํ๋ฉด ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ์ฐธ์กฐํ๋ ์ปดํฌ๋ํธ๊ฐ ๋ค์ ๊ทธ๋ ค์ง๋๋ก ํ๋ ๊ฒ.
๐ Redux !
์ ์ด์ Redux์ ๋ํด์ ๋ณธ๊ฒฉ์ ์ผ๋ก ์ฌ์ฉํด๋ณด๊ณ ์์๋ณด์.
์ฌ์ค state์ ์ง์ ์ ๊ทผ์ด ์๋๋ผ ์ฌ์ค ๋ฉ์๋์ ์ ๊ทผํ๋ ํ์์ด๋ค. (@getter @setter ๋๋)
Redux๋ ์ผ๊ด๋๊ฒ ์๋ํ๊ณ ๋ค์ํ ํ๊ฒฝ์์ ์คํ๊ฐ๋ฅํ๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ์ ๋ ผ๋ฆฌ๋ฅผ ์ค์์ผ๋ก ์ง์คํ ํ๋ฉฐ ์คํ์ทจ์/๋ค์ ์คํ, ์ํ ์ง์์ฑ๋ฑ๊ณผ ๊ฐ์ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ์ฌ์ฉ ๊ฐ๋ฅ
devTools๋ฅผ ์ฌ์ฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์
์ํ๊ฐ ์ธ์ , ์ด๋์, ์, ์ด๋ป๊ฒ ๋ณ๊ฒฝ๋์๋์ง ์ฝ๊ฒ ์ถ์ ํ ์ ์๋ค.
Redux์ ์ํคํ
์ฒ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ณ๊ฒฝ์ฌํญ์ ๊ธฐ๋กํ๊ณ ์์ ํ ์ค๋ฅ ๋ณด๊ณ ์๋ฅผ ์๋ฒ์ ๋ณด๋ผ ์ ์์.
Redux๋ ๋ชจ๋ UI๊ณ์ธต์์ ์๋ํ๋ฉฐ ์ฌ์ฉ์์ ์๊ตฌ์ฌํญ์ ๋ง๋ ๋๊ท๋ชจ ์ ๋์จ ์์ฝ์์คํ ์ ๊ฐ์ถ๊ณ ์์.
์ ๊ทธ๋ผ ์ค์ต์ ํตํด ์ค์ ๋ก ์ฌ์ฉํด๋ณด์!
npm install redux --save
npm install react-redux --save
npm install @reduxjs/toolkit react-redux
์งง๊ฒ ์ด๋ค๋ฉด..(์ ์ฝ๋์ ๋์ผํ๋ค)
npm i redux -S
npm i react-redux -S
npm i @reduxjs/toolkit react-redux
Controller์์๋ index์ Redux๋ฅผ ์ ์ด
์ฌ๊ธฐ์ dispatch๋ฅผ ํตํด์ Redux๋ฅผ ์ ์ด
app.js์์๋ index.js์ ์ํ๊ฐ ๋ณ๊ฒฝ๋๋ฉด
useSelector๋ผ๋ ๋ถ๋ถ์ผ๋ก ๋ณ๊ฒฝ์ฌํญ์ ๊ฐ์งํ๊ณ ์ฌ ๋๋๋งํจ.
Controller์์ ๋์คํจ์น์์ ํธ์ถํ ๋ index.js์ reducer๋ฅผ ๋ฐ์์์ ์
index.js๊ฐ ์ ์ผ ์ต์์ ์ปดํฌ๋ํธ์ด๋ฏ๋ก index.js์๋ค๊ฐ redux๋ฅผ ์ค์ ํ๊ณ ์ฌ๊ธฐ์ ์๋ reducer์ State๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
// react-redux ๊ด๋ จ ๋ชจ๋ import
import {Provider} from "react-redux"
import { legacy_createStore as createStore } from 'redux';
์ฌ๊ธฐ์๋ ๋ณ๋ช (Alias)๋ฅผ ํตํด createStore๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์๋๋ก ํ๋ค.
//ํ์ํ State๋ค์ ์ง์ด ๋ฃ์ด์ ์ฌ์ฉํ๋ฉด ๋๋ค.
const currentState = {count : 1};
์ด๋ฅผ ๊ด๋ฆฌํด ์ฃผ๋ getter/setter
๊ฐ ํ์ํ๋ฐ ์ด๋ฅผ ๊ด๋ฆฌํด ์ฃผ๋ ๊ฒ์ด ๋ฐ๋ก reducer์ด๋ค.
function reducer(state = currentState, action) {
// ๋ง์ฝ ๊ฐ์ด ์ ์๋์ง ์์๋ค๋ฉด ๊ฐ์ ๋ฃ์ด์ค๋ค.
if(currentState == undefined) {
return {count : 10};
}
// State๋ฅผ ๋ณ๊ฒฝ
if(action.type == 'count์ฆ๊ฐ') {
state.count++;
}
if(action.type == 'count๊ฐ์') {
state.count--;
}
// ์๋ก์ด State๋ฅผ ๋ง๋ค์ด์ ๋ฐํ
const newState = {...state}
return newState;
}
createStore๋ฅผ ํตํด์ reducer๋ฅผ store๋ก ์์ฑํด์ค๋ค.
let store = createStore(currentState);
์ด์ app.js์ชฝ์ผ๋ก ๋์ด๊ฐ๋ณด๋๋ก ํ์.
import { useSelector } from 'react-redux';
์ผ๋จ ์ ์ธ๋ State์ธ count๊ฐ์ index.js
์์ ํ๋ ๊ฐ์ ธ์ ๋ณผ ๊ฒ์ด๋ฏ๋ก redux์์ useSelector๋ฅผ ์ ์ธํ๋ค.
// ์ฝ๋ฐฑํจ์๋ก ๋ง๋ค์ด์ค๋ค state๋ฅผ useselector์์ ๋ฐ์์ ๊ฐ์ ๊ฐ์ ธ์ด
const count = useSelector((state)=>{
return state.count;
})
// ๋ฆฌํด๋๋ ๋ถ๋ถ
return(
<div>
<h1>React Redux Programing</h1>
<p>count : {count}</p>
</div>
)
๊ฐ์ด ์ ๋์ค๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ด์ dispatch๋ฅผ ์ฌ์ฉํด๋ณด์.
useSelector๋ ๊ฐ์ ์ฐธ์กฐํ ๋ ๊ฐ์ ๋ณ๊ฒฝํ ๋๋ useDispatch๋ฅผ ์ฌ์ฉํ๋ค.
๋จผ์ dispatch ์ฌ์ฉ์ ์ํด useDispatch
๋ฅผ ํตํด dispatch๋ฅผ ํ๋ ์์ฑํ์.
// import๋ฌธ์๋ค๊ฐ ์ถ๊ฐ
import { useSelector, useDispatch } from 'react-redux';
// dispatch ๊ฐ์ฒด ์์ฑ - ํจ์์ฒ๋ผ ์ฌ์ฉํจ
const dispatch = useDispatch();
๋ฆฌํด๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ด ์ถ๊ฐํด์ค๋ค.
return (
<div>
<h1>React Redux Programing</h1>
<p>count : {count}</p>
<p>
<button onClick={()=>{
dispatch({type:'count์ฆ๊ฐ'})
}}>
์ฆ๊ฐ
</button>
<button onClick={()=>{
dispatch({type:'count๊ฐ์'})
}}>
๊ฐ์
</button>
</p>
</div>
);
๋ค์๊ณผ ๊ฐ์ด ๋ฒํผ์ ํตํด ์ฆ๊ฐ์ ๊ฐ์๊ฐ ์ด๋ฃจ์ด์ง๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๋๋ฌด ์์ค์ฝ๋๊ฐ ๋์กํด์ง ์ ์์ผ๋ฏ๋ก ์ด์ฏค์์ ์ปดํฌ๋ํธ๋ฅผ ๋ชจ๋ํํ์.
View.js
๋ฅผ ํ๋ ์์ฑํด์ ๋ค์๊ณผ ๊ฐ์ด ๋ง๋ค์ด์ค๋ค.
import { useDispatch, useSelector } from 'react-redux';
function StateView(){
const count = useSelector((state)=> {
return state.count;
});
const age = useSelector((state)=> {
return state.age;
});
return(
<>
<p>count : {count}</p>
<p>age : {age}</p>
</>
)
}
export default StateView;
You can access to whole source code right Here!