๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Redux

Redux Toolkit ์— ๋Œ€ํ•˜์—ฌ ์•Œ์•„๋ณด๊ธฐ

๋ฆฌ๋•์Šค๋ฅผ ๊ณต๋ถ€ํ•˜๋‹ค Velopert๋‹˜์˜ ๋ธ”๋กœ๊ทธ์—์„œ Redux Toolkit์ด ๋ฆฌ๋•์Šค ๊ฐœ๋ฐœ์˜ ํ•„์ˆ˜ํ’ˆ์ด๋ผ๋Š” ๊ธ€์„ ์ฝ๊ณ  Redux Toolkit์— ๋Œ€ํ•ด ํฅ๋ฏธ๋ฅผ ๊ฐ€์ง€๊ณ  ๊ณต๋ถ€๋ฅผ ์‹œ์ž‘ํ–ˆ๋‹ค.

 

Redux Toolkit์˜ ํƒ„์ƒ ์ด์œ 

 

Redux Toolkit์€ ๋ฆฌ๋•์Šค๊ณต์‹ ํ™ˆํŽ˜์ด์ง€์—์„œ ํ•ด๋‹น ๊ด€์‹ฌ์‚ฌ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ๋งŒ๋“ค์–ด ์กŒ๋‹ค๊ณ  ํ•œ๋‹ค 

 

Redux ์ €์žฅ์†Œ ๊ตฌ์„ฑ์ด ๋„ˆ๋ฌด ๋ณต์žก๋‹ค

Redux๊ฐ€ ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŽ์€ ํŒจํ‚ค์ง€๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค

Redux์—๋Š” ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์ด ํ•„์š”ํ•˜๋‹ค ( ์•ก์…˜ํƒ€์ž…, ์•ก์…˜์ƒ์„ฑํ•จ์ˆ˜, ๋ฆฌ๋“€์„œ 3๊ฐ€์ง€๊ฐ€ ํ•„์š”ํ•˜๋‹ค )

 

์ฆ‰ Redux Toolkit์€ ๋ฆฌ๋•์Šค๋ฅผ ๋”์šฑ ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ๋งŒ๋“ค์–ด์ง„ ๋„๊ตฌ์ด๋‹ค

 

 

Redux Toolkit์˜ ํŠน์ง•

Redux Toolkit์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์ด ์ œ๊ณต๋œ๋‹ค

 

configureStore()ํ•จ์ˆ˜๋Š” Slice ๋ฆฌ๋“€์„œ๋ฅผ ์ž๋™์œผ๋กœ ๊ฒฐํ•ฉํ•˜๊ณ  ์ œ๊ณตํ•˜๋Š” Redux ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , ๊ธฐ๋ณธ์ ์œผ๋กœ redux-thunk๋ฅผ ํฌํ•จํ•˜๋ฉฐ Redux DevTools Extension์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

createReducer()์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” switch ๋ฌธ์„ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ  reducerํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค. ๋˜ํ•œ immer ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๋ฐ˜์ ์ธ ์ฝ”๋“œ๋กœ ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ถˆ๋ณ€์„ฑ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

createAction() ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” ์ฃผ์–ด์ง„ action type์— ๋”ฐ๋ผ action createํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ํ•จ์ˆ˜ ์ž์ฒด์—toString()์ด ์ •์˜๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ๋ณ„๋„์˜ ์ƒ์ˆ˜๋ฅผ ์„ ์–ธํ•  ํ•„์š” ์—†์ด ํ•จ์ˆ˜ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

createSlice() ํ•จ์ˆ˜ ๋ฆฌ๋“€์„œ ํ•จ์ˆ˜ ์„ธํŠธ๋กœ์„œ, ์Šฌ๋ผ์ด์Šค ์ด๋ฆ„ ๋ฐ ์ดˆ๊ธฐ ์ƒํƒœ ๊ฐ’์„ ๋ฐ›์•„์„œ ์ž๋™์œผ๋กœ slice reducer์™€ action creator, action types๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

 

createSelector()์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” Reselect ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๋„๋ก re-exportํ•œ ๊ฒƒ์ด๋‹ค.

 

์ถœ์ฒ˜ ( Redux Toolkit ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€ )

 

Redux Toolkit ์„ค์น˜

 

// NPM
npm install @reduxjs/toolkit

// Yarn
yarn add @reduxjs/toolkit

 

 

 

 

configureStore

 

 

import rootReducer from './modules';
import { configureStore } from '@reduxjs/toolkit';

const store = configureStore({ reducer: rootReducer });

 

 

Redux Toolkit์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  Store๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋Š”  โ€‹redux๊ฐ€ ์ œ๊ณตํ•˜๋Š” createStore ๋ฅผ ์ด์šฉํ•ด ์ƒ์„ฑํ–ˆ๋‹ค.

 

Redux-Toolkit ์˜ configureStore ๋Š” ์œ„ ์ฒ˜๋Ÿผ reducer ํ•„๋“œ๋ฅผ ํ•„์ˆ˜์ ์œผ๋กœ ๋„ฃ์–ด์ฃผ์–ด์•ผ ํ•œ๋‹ค

createStore๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Store๋ฅผ ์ƒ์„ฑํ•  ๋•Œ์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ๊ธฐ๋ณธ์ ์œผ๋กœRedux DevTools Extension ์„ ์ œ๊ณตํ•œ๋‹ค.

 

 

createAction

โ€‹

 

const INCREASE = 'counter/INCREASE';
const DECREASE = 'counter/DECREASE';

export const increase = createAction(INCREASE);
export const decrease = createAction(DECREASE);

 

 

createAction์€ ์ด์ „ ํฌ์ŠคํŒ…์—์„œ Redux Toolkit์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ๋„ createAction์„ ์‚ฌ์šฉํ–ˆ์—ˆ๋Š”๋ฐ Redux Toolkit์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ˆ ์ ๊ทน ํ™œ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์ค„์ด๋„๋ก ํ•˜์ž

 

 

createReducer

 

 

const counter = createReducer(initialState, {
  [INCREASE]: (state, action) => ({ number: state.number + 1 }),
  [DECREASE]: (state, action) => ({ number: state.number - 1 }),
});

 

 

๋ฆฌ๋“€์„œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜๋กœ ์ด์ „ ํฌ์ŠคํŒ…์—์„œ๋Š” handleActions ๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ–ˆ์—ˆ๋Š”๋ฐ Redux Toolkit์—์„œ ์ œ๊ณตํ•˜๋Š” createReducer์™€ ์‚ฌ์šฉ๋ฐฉ๋ฒ•์€ ์ „๋ฐ˜์ „์œผ๋กœ ๋น„์Šทํ•œ ๊ฒƒ ๊ฐ™๋‹ค 

 

switch๋ฅผ ์“ฐ์ง€ ์•Š๊ณ  Reducer๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๋Š” ๊ฒƒ์ด ์•„์ฃผ ํŽธ๋ฆฌํ•˜๋‹ค 

 

createReducer ์˜ ์ฒซ๋ฒˆ ์งธ ์ธ์ž๊ฐ’์ธ initialState ์˜ ์œ„์น˜๋งŒ handleActions์™€ ๋‹ค๋ฅธ ์ ์ด๋‹ค

โ€‹

 

createSlice

 

createSlice ๋Š” action๊ณผ Reducer๋ฅผ ํ•œ๋ฒˆ์— ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค 

 

 

const counter = createSlice({
  name: 'counter',
  initialState: {
    number: 0,
  },
  reducers: {
    increase: (state, action) => ({ number: state.number + 1 }),
    decrease: (state, action) => ({ number: state.number - 1 }),
  },
});

 

 

name ์†์„ฑ์€ ์•ก์…˜์˜ ๊ฒฝ๋กœ๋ฅผ ์žก์•„์ค„ ํ•ด๋‹น ์ด๋ฆ„์„ ๋‚˜ํƒ€๋‚ด๊ณ , initialState๋Š” ์ดˆ๊ธฐ๊ฐ’์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

 

reducer๋Š” createReducer์˜ ๊ตฌ์กฐ์™€ ๋น„์Šทํ•˜๋‹ค

 

reducers ์•ˆ์˜ ์ฝ”๋“œ๋“ค์€ ์•ก์…˜ ํƒ€์ž…, ์•ก์…˜ ์ƒ์„ฑ ํ•จ์ˆ˜, Reducer ์˜ ๊ธฐ๋Šฅ์ด ํ•ฉ์ณ์ ธ ์žˆ๋Š” ํ•จ์ˆ˜๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

Immer

 

โ€‹

๋ฆฌ์•กํŠธ๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœํ•  ๋•Œ ๋ถˆ๋ณ€์„ฑ์˜ ์œ ์ง€๋ฅผ ์œ„ํ•ด push์™€ ๊ฐ™์€ ๊ธฐ์กด Data์— ์˜ํ–ฅ์ด ๊ฐ€๋Š” ๋ฉ”์†Œ๋“œ ๋Œ€์‹ ์—  state ๋ฅผ ์ง์ ‘ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ  ๋ณต์‚ฌํ•ด์„œ ์ƒˆ๋กœ ์ƒ์„ฑํ•ด๋‚ด๋Š” concat, filter์™€ ๊ฐ™์€ ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•ด ์™”์—ˆ๋‹ค.

โ€‹

Redux-Toolkit ์˜ createReducer ์™€ createSlice ํ•จ์ˆ˜๋Š” ๋ถˆ๋ณ€์„ฑ์„ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์•„๋„ ์ž๋™์œผ๋กœ ๋ถˆ๋ณ€์„ฑ์„ ์œ ์ง€ํ•ด์ฃผ๋Š”

Immer ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ€์ง€๊ณ ์žˆ๋‹ค

โ€‹

Redux Toolkit์„ ์‚ฌ์šฉํ•˜๋ฉด Immer์˜ ๊ธฐ๋Šฅ์œผ๋กœ ์ธํ•ด์„œ return ํ•˜์ง€ ์•Š์•„๋„ ์ž๋™์œผ๋กœ ๋ถˆ๋ณ€์„ฑ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.โ€‹