[React] Redux middleware 리λμ€ λ―Έλ€μ¨μ΄
πΈ Reduxλ?
리λμ€λ Flux ν¨ν΄μ ꡬνν λνμ μΈ λΌμ΄λΈλ¬λ¦¬ μ€μ νλμ λλ€.
Flux ν¨ν΄
νμ΄μ€λΆμμ μ ν리μΌμ΄μ μμμ λ°μ΄ν° νλ¦μ΄ 볡μ‘ν΄λ©° λ°μνλ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ λ°νν ν¨ν΄μ λλ€.
μ΄ ν¨ν΄μ λ°μ΄ν°κ° λ¨λ°©ν₯μΌλ‘λ§ νλ₯΄κ³ , μλ‘μ΄ λ°μ΄ν°λ₯Ό λ£μΌλ©΄ μ²μλΆν° λ°μ΄ν° νλ¦μ΄ λ€μ μμλ©λλ€. μ΄λ₯Ό ν΅ν΄μ μνμ μ μ΄ νμμ μμ μ£Όκ³ μμΈ‘ κ°λ₯νλ€λ νΉμ§μ κ°μ§κ² λ©λλ€.
λμ
νλ©΄μμ μ‘μ μ΄ λ°μνλ©΄ μ΄λ₯Ό λμ€ν¨μ²κ° 리λμμ μ λ¬νκ³ , 리λμλ μνλ₯Ό λ³κ²½ν©λλ€.
μ΄ λͺ¨λ μνλ μ€ν μ΄μμ κ΄λ¦¬ν©λλ€.

νκ³
리λμ€ μ€ν μ΄μμλ λκΈ°μ μΌλ‘ μ‘μ μ λμ€ν¨μΉνκ³ , 리λμ ν¨μλ₯Ό νΈμΆνμ¬ stateλ₯Ό μ λ°μ΄νΈνλ κ²μ λ΄λΉν©λλ€.
μ¦, λΉλκΈ° μ²λ¦¬λ μννμ§ λͺ»νλ νκ³κ° μμ΅λλ€.
πΈ Redux middlewareλ?
리λμ€ λ―Έλ€μ¨μ΄λ₯Ό μ¬μ©νλ©΄ μ‘μ μ΄ λμ€ν¨μΉλ λ€μ, 리λμμμ ν΄λΉ μ‘μ μ λ°μμ μ λ°μ΄νΈνκΈ° μ μ μΆκ°μ μΈ μμ μ ν μ μμ΅λλ€.
μ£Όλ‘ λΉλκΈ° λ‘μ§μ μ²λ¦¬ν λ μ¬μ©λλ©°, λνμ μΌλ‘ Redux-thunk, Redux-saga λΌμ΄λΈλ¬λ¦¬κ° μ‘΄μ¬ν©λλ€.

ꡬν
리λμ€ λ―Έλ€μ¨μ΄λ μλμ κ°μ΄ ꡬνλμ΄ μμ΅λλ€.
const middleware = store => next => action => {
// νκ³ μΆμ μμ
...
}
μ ν¨μλ₯Ό νμ΄μ°λ©΄ μλμ κ°μ΅λλ€.
function middleware(store) {
return function (next) {
return function (action) {
// νκ³ μΆμ μμ
...
};
};
};
νλΌλ―Έν° μμΈ
store : dispatch, getState λ±μ λ΄μ₯ν¨μλ₯Ό μ¬μ©ν μ μμ΅λλ€.
next : μ‘μ μ λ€μ λ―Έλ€μ¨μ΄μ μ λ¬ν©λλ€. λ§μ½ λ€μ λ―Έλ€μ¨μ΄κ° μμΌλ©΄ 리λμμ μ‘μ μ μ λ¬ν©λλ€.
action : νμ¬ μ²λ¦¬νκ³ μλ μ‘μ κ°μ²΄μ λλ€.
πΈ Redux thunk
redux thunkλ 리λμ€μμ λΉλκΈ° μμ μ μ²λ¦¬ν λ κ°μ₯ λ§μ΄ μ¬μ©νλ λ―Έλ€μ¨μ΄μ λλ€.
리λμ€μμλ μ‘μ κ°μ²΄λ₯Ό λμ€ν¨μΉ νμμ§λ§, redux thunkλ₯Ό μ¬μ©νλ©΄ ν¨μλ₯Ό λμ€ν¨μΉν μ μμ΅λλ€.
redux thunkλ μλμ κ°μ΄ ꡬνλμ΄ μμ΅λλ€.
const thunk = store => next => action =>
typeof action === 'function'
? action(store.dispatch, store.getState)
: next(action)
μμ
export function setRegions(regions) {
return {
type: 'setRegions',
payload: {
regions,
},
};
}
export function loadRegions() {
return async (dispatch) => {
const regions = await fetchRegions();
dispatch(setRegions(regions));
};
}
μ‘μ μμ± ν¨μ λ΄μμ dispatchλ₯Ό νλΌλ―Έν°λ‘ λ°λ ν¨μλ₯Ό 리ν΄νλ ννλ‘ λΉλκΈ° μ²λ¦¬λ₯Ό ν μ μμ΅λλ€.
νμ§λ§ μ΄λ€ μ‘μ μμ± ν¨μμμλ κ°μ²΄λ₯Ό λ°ννκ³ , μ΄λ€ μ‘μ μμ± ν¨μμμλ ν¨μλ₯Ό λ°ννκΈ° λλ¬Έμ μ‘μ μ΄ λ³΅μ‘ν΄μ§λ€λ λ¨μ μ΄ μμ΅λλ€.
πΈ Redux saga
redux sagaλ redux thunk λ€μμΌλ‘ κ°μ₯ λ§μ΄ μ¬μ©λλ λΌμ΄λΈλ¬λ¦¬μ λλ€.
μ‘μ μ λͺ¨λν°λ§νκ³ μλ€κ°, νΉμ μ‘μ μ΄ λ°μνλ©΄ νΉμ μμ μ νλ λ°©μμΌλ‘ λμν©λλ€.
redux sagaλ redux thunkλ‘λ λͺ»νλ μμ μ μ²λ¦¬ν μ μμ΅λλ€.
- λΉλκΈ° μμ μ ν λ κΈ°μ‘΄ μμ²μ μ·¨μ μ²λ¦¬ ν μ μμ΅λλ€
- νΉμ μ‘μ μ΄ λ°μνμ λ μ΄μ λ°λΌ λ€λ₯Έ μ‘μ μ΄ λμ€ν¨μΉλκ²λ νκ±°λ, μλ°μ€ν¬λ¦½νΈ μ½λλ₯Ό μ€νν μ μμ΅λλ€.
- μΉμμΌμ μ¬μ©νλ κ²½μ° Channel μ΄λΌλ κΈ°λ₯μ μ¬μ©νμ¬ λμ± ν¨μ¨μ μΌλ‘ μ½λλ₯Ό κ΄λ¦¬ν μ μμ΅λλ€ (μ°Έκ³ )
- API μμ²μ΄ μ€ν¨νμ λ μ¬μμ²νλ μμ μ ν μ μμ΅λλ€.
λν, redux thunkμ λ¬λ¦¬ actionμ΄ λ³΅μ‘ν΄μ§μ§ μλλ€λ μ₯μ μ΄ μμ΅λλ€.
λ°λ©΄, redux sagaλ₯Ό μ¬μ©νκΈ° μν΄μλ μλ°μ€ν¬λ¦½νΈ ES6μ μ λλ μ΄ν° κ°λ μ μ΄ν΄νκ³ μμ΄μΌ νκΈ° λλ¬Έμ μ΄κΈ° λ¬λ 컀λΈκ° λμ νΈμ΄λΌλ λ¨μ μ΄ μμ΅λλ€.
πΈ Redux thunk vs Redux saga
Redux thunk | Redux saga | |
---|---|---|
μ₯μ | - sagaμ λΉν΄ 보μΌλ¬ νλ μ΄νΈ μ½λκ° μ κ³ μ΄ν΄νκΈ° μ½λ€. | - sagaκ° μ 곡νλ λ€μν effectsλ₯Ό μ¬μ©νμ¬ κΉλν λ‘μ§ κ΅¬νμ΄ κ°λ₯νλ€. |
λ¨μ | - 볡μ‘ν async λ‘μ§μΌλ‘ μΈν΄ μ½λ°± μ§μ₯μ λ°μμν¬ μ μλ€. - unit testκ° μ΄λ €μ΄ κ΅¬μ‘°λ‘ λμ΄μλ€. |
- thunkμ λΉν΄ 보μΌλ¬ νλ μ΄νΈ μ½λ μμ΄ λ§λ€. - λ¬λ 컀λΈκ° λλ€. |
μ°Έκ³
https://min9nim.vercel.app/2020-04-23-redux-saga/
https://ko.redux.js.org/tutorials/essentials/part-5-async-logic