Frontend/React

[React] Redux middleware λ¦¬λ•μŠ€ 미듀웨어

Kei Song 2022. 7. 3. 13:07

πŸ”Έ 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λ‘œλŠ” λͺ»ν•˜λŠ” μž‘μ—…μ„ μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  1. 비동기 μž‘μ—…μ„ ν•  λ•Œ κΈ°μ‘΄ μš”μ²­μ„ μ·¨μ†Œ 처리 ν•  수 μžˆμŠ΅λ‹ˆλ‹€
  2. νŠΉμ • μ•‘μ…˜μ΄ λ°œμƒν–ˆμ„ λ•Œ 이에 따라 λ‹€λ₯Έ μ•‘μ…˜μ΄ λ””μŠ€νŒ¨μΉ˜λ˜κ²Œλ” ν•˜κ±°λ‚˜, μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλ₯Ό μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  3. μ›Ήμ†ŒμΌ“μ„ μ‚¬μš©ν•˜λŠ” 경우 Channel μ΄λΌλŠ” κΈ°λŠ₯을 μ‚¬μš©ν•˜μ—¬ λ”μš± 효율적으둜 μ½”λ“œλ₯Ό 관리할 수 μžˆμŠ΅λ‹ˆλ‹€ (μ°Έκ³ )
  4. 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

https://doqtqu.tistory.com/335

λŒ“κΈ€μˆ˜0