๋ฆฌ๋์ค๋ฅผ ๊ณต๋ถํ๋ค 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 ํ์ง ์์๋ ์๋์ผ๋ก ๋ถ๋ณ์ฑ์ ์ ์งํ๋ฉด์ ์ฌ์ฉํ ์ ์๋ค.โ
'Redux' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Redux-Toolkit ์์ Saga ์ฌ์ฉํ๊ธฐ (Feat. Typescript) (0) | 2021.08.01 |
---|---|
๋ฆฌ๋์ค์์ Hooks ์ฌ์ฉํ๊ธฐ (0) | 2021.05.25 |
๋ฆฌ๋์ค ์์ ํ๊ฒฝ ์ค์ ๋ฐ ์ฌ์ฉ๋ฐฉ๋ฒ (1) | 2021.05.24 |
๋ฆฌ๋์ค๋ ๋ฌด์์ธ๊ฐ ? (0) | 2021.05.20 |