Frontend/React

[Redux]๋ฏธ๋“ค์›จ์–ด(middleware)

rachel_13 2022. 8. 14. 16:11

๐Ÿค” ๋ฏธ๋“ค์›จ์–ด๋Š” ๋ฌด์—‡์ธ๊ฐ€?

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);