๐ค ๋ฏธ๋ค์จ์ด๋ ๋ฌด์์ธ๊ฐ?
action์์ ์ ์ธ๋ state๋ฅผ ๋ณ๊ฒฝํ๋ ๋ถ๋ถ์ด dispatch๋ฅผ ํตํด ์คํ๋๊ธฐ ์ ์ ๋์ํ๋ค.
์ฆ, action ๊ณผ dispatch ์ฌ์ด์์ ์ผ์ด๋๋ ๋์์ ์ ์ดํ๋ ๋๊ตฌ๋ผ๊ณ ์ดํดํ๋ฉด ๋๊ฒ ๋ค.
๋น๋๊ธฐ๋ฅผ ๊ตฌํํ ๋ ์ฉ์ดํ๋ฉฐ, ๋ฆฌ๋์ค์ ๋น๋๊ธฐ ๊ด๋ฆฌ tool๋ก๋ redux-thunk, redux-saga ์ ๋๊ฐ ์๋ค.
[๊ธฐ๋ณธ ํ ํ๋ฆฟ]
const middleware = store => next => action => {
(1)
next(action) //๊ธฐ๋ณธ ๊ธฐ๋ฅ : action์ด dispatch๋ฅผ ํตํด ์คํ๋๋ค.
(2)
}
ํจ์๊ฐ ์ค์ฒฉ๋ ํํ์ด๋ค. ํ๋ผ๋ฏธํฐ๊ฐ 3๊ฐ ์ด๊ณ return ๋ฌธ์ด 2๊ฐ์ธ ๊ณ ์ฐจํจ์ ํํ์ด๋ค.
์ด๋ฅผ function ์ผ๋ก ๋ค์ ์์ฑํด๋ณธ๋ค๋ฉด,
function middleware(store) {
return function (next) {
return function (action) {
};
};
};
* store : ๋ฆฌ๋์ค์ store ์ธ์คํด์ค (createStore๋ก ์ ์ธํ๋ ๋ถ๋ถ)
* next : dispatch์ ๊ฐ๋ค๊ณ ๋ด๋ ๋ฌด๋ฐฉํ๋ค.
action์ ์คํ์ํค๋ ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ next(action) ์ด๋ค.
* action : state ๋ณ๊ฒฝ ๋ด์ฉ์ ๋ด๋ ๊ฐ์ฒด
๋ฏธ๋ค์จ์ด๋ฅผ ํตํด dispatch ์ /ํ๋ก ๋น๋๊ธฐ๋ฅผ ์ปจํธ๋กค ํ ์ ์๊ฒ ๋๋ค.
โจ ๋ฏธ๋ค์จ์ด ์ง์ ์ฌ์ฉํด๋ณด๊ธฐ
* store ์ ์ธ์ enhancer ์ฌ์ฉ
enhance + -er : ํฅ์์ํค๋ค/๋์ด๋ค
๐ ๊ธฐ์กด์ ๋ฆฌ๋์ค์ ๊ธฐ๋ฅ์ ํ์ฅ์์ผ์ ๊ธฐ๋ฅ์ ํฅ์์ํค๋ ์ต์ ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.
enhancer๋ฅผ ์ด์ฉํด์ ๋ฏธ๋ค์จ์ด๋ฅผ ์คํํ๋ค.
* ๋ฏธ๋ค์จ์ด ์ ์ธ
const middleware = (store) => (next) => (action) => {
console.log('action start', action);
//๊ธฐ๋ฅ ์ถ๊ฐ ~ dispatch action ์ ~ ๋น๋๊ธฐ๋ก ํ์ฉ
next(action);
//๊ธฐ๋ฅ ์ถ๊ฐ ~ dispatch action ํ ~ ๋น๋๊ธฐ๋ก ํ์ฉ
console.log('action is end')
};
* ๋ฏธ๋ค์จ์ด ์คํ - applyMiddleware
const enhancer = applyMiddleware(middleware);
const store = createStore(reducer, initialState, enhancer);
โจ thunkMiddleware
๋ฆฌ๋์ค thunk ์ฌ์ฉํด์ ๋น๋๊ธฐ ํํ์ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค.
action์ ๊ฐ์ฒดํ ์ด๋ผ๊ณ ์ด์ ํฌ์คํธ์์ ์ธ๊ธํ ์ ์ด ์๋ค.
๊ทธ๋ฐ๋ฐ, thunk๋ action ์ ํจ์ํํ๋ก ์ฌ์ฉํ์ฌ, ๊ธฐ๋ณธ action ๊ณผ ๊ตฌ๋ถ๋๋ค.
const thunkMiddleware = (store) => (next) => (action) => {
if (typeof action === 'function') {
return action(store.dispatch, store.getState);
}
return next(action);
}
- ์ก์
์ด ํจ์ํ์ผ ๊ฒฝ์ฐ, ์ฆ ๊ฐ์ฒด๊ฐ ์๋ ๊ฒฝ์ฐ = ๋น๋๊ธฐ์ธ ๊ฒฝ์ฐ ์ก์
์ ํจ์๋ก ๋ฃ์ด์ค๋ค.
- ๊ธฐ๋ณธ์ ์ผ๋ก ์ก์
์ ๋๊ธฐ์ด๋ค.(๊ฐ์ฒดํํ)
- ๋ก๊ทธ์ธ/ํ์๊ฐ์
/๊ฒ์๊ธ ์์ฑ ๋ฑ ์๋ฒ๋ฅผ ํ ๋ฒ ๊ฑฐ์ณ์์ผ ํ๋ ๊ฒ๋ค์ด ๋ชจ๋ ๋น๋๊ธฐ๋ค.
โจ ์ผ๋ฐ ๋ฏธ๋ค์จ์ด์ ํจ๊ป ์ฌ์ฉํ๊ธฐ
const enhancer = compose(
applyMiddleware(
firstMiddleware,
thunkMiddleware
),
)
const store = createStore(reducer, initalState, enhancer);
'Frontend > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
pnpm cache clean (0) | 2023.03.02 |
---|---|
Typescript - useRef() ์ฌ์ฉ์ type ์ค์ (0) | 2022.12.13 |
[React] + [Typescript + Emotion]์์ props ๋๊ธฐ๋ ๋ฐฉ๋ฒ (0) | 2022.09.10 |
[Redux] ๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ(SoC) (0) | 2022.08.14 |
[Redux] ๋ฆฌ๋์ค ์๋ฆฌ ์ดํดํ๊ธฐ (0) | 2022.08.13 |