์ด์ ์ redux... ์ ~~๋ง ๋ถํธํ๋ค ๊ฐ์ธ์ ์ผ๋ก...
๊ทธ๋ฐ๋ฐ ๋คํํ๋ redux์ ์ข ๋ ์ฌ์ฉํ๊ธฐ ํธํ? ๋ฒ์ ์ธ redux toolkit
์ ํญํด ์ฃผํน๊ธฐ ๋ง์ง๋ง ์ฃผ์ฐจ์์์ผ ์ ํ ๊ธฐํ๊ฐ ์๊ฒจ ์ ๋ฆฌํด ๋ณด๋ ค๊ณ ํ๋ค.
์ผ๋จ Redux Toolkit
์ Redux์ ๊ฐ๋ ๋ฒ์
์ด๋ผ๊ณ ์๊ฐํ๋ค.
๊ธฐ์กด์ ๋ฆฌ๋์ค๋ ์๋ ์ฌ์ฉ๋์๋ ducks ํจํด
์ ์์๋ค์ด ์ ์ฒด์ ์ธ ์ฝ๋์ ์์ ๋๋ฆฐ๋ค๋ ๊ฐ๋ฐ์๋ค์ ๋ถ๋ง์ด ํ๋ ๋ ๋ค๋ฆฌ๊ธฐ ์์ํ๊ณ , ์ด๋ฅผ ์ธ์งํ redux ๊ฐ๋ฐ์ง๋ค์ ์ฝ๋๋ฅผ ๋ ์ ๊ฒ ๊ทธ๋ฆฌ๊ณ ๋ฆฌ๋์ค๋ฅผ ๋ ํธํ๊ฒ ๋ง๋ค๊ธฐ ์ํด ๋ณํ๋ฅผ ๋์
์ ํ์๋ค.
๊ทธ๋ ๋ค๊ณ ๊ธฐ์กด์ redux ์ ์์ ๋ฌ๋ผ์ง์ง ์์๋ค. ๋ฐ๋ ๋ถ๋ถ์ ํ๋ฒ ์ด์ผ๊ธฐ ํด๋ณด์!
npm install react-redux @reduxjs/toolkit
์์ ์ฝ๋๋ก reduxjs/toolkit ๋ฒ์ ์ผ๋ก ์ค์นํ๋ฉด ๋๋ค.
// redux (toolkit x)
// Action Value
const ADD_NUMBER = "ADD_NUMBER";
const MINUS_NUMBER = "MINUS_NUMBER";
// Action Creator
export const addNumber = (payload) => {
return {
type: ADD_NUMBER,
payload,
};
};
export const minusNumber = (payload) => {
return {
type: MINUS_NUMBER,
payload,
};
};
// Initial State
const initialState = {
number: 0,
};
// Reducer
const counter = (state = initialState, action) => {
switch (action.type) {
case ADD_NUMBER:
return {
number: state.number + action.payload,
};
// [ํด์ฆ ๋ต]
case MINUS_NUMBER:
return {
number: state.number - action.payload,
};
default:
return state;
}
};
// export default reducer
export default counter;
vs
// redux toolkit
import { createSlice } from "@reduxjs/toolkit";
const initialState = {
number: 0,
};
// ํ๋จ์ reducers ๋ถ๋ถ์์ ๋ง๋ค์ด์ง ํจ์ ์์ฒด๊ฐ ๋ฆฌ๋์์ logic์ด ๋๋ค. = action
const counterSlice = createSlice({
name: "counter",
initialState,
reducers: {
addNumber: (state, action) => {
state.number = state.number + action.payload;
},
minusNumber: (state, action) => {
state.number = state.number - action.payload;
},
},
});
// ์ก์
ํฌ๋ฆฌ์์ดํฐ๋ ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ๊ธฐ ์ํด export ํ๊ณ
export const { addNumber, minusNumber } = counterSlice.actions;
// reducer ๋ configStore์ ๋ฑ๋กํ๊ธฐ ์ํด export default ํฉ๋๋ค.
export default counterSlice.reducer;
๊ธฐ์กด์ redux์์ ๋ค๋ฃฌ ์์์ธ Action Value
, Action Creator
, Reducer
๋ถ๋ถ์ ๋ฐ๋ก๋ฐ๋ก ๊ตฌ๋ถ์ง์ด ์ ํด์ง ์ฝ๋ ๊ท์น ๋ฑ์ ๋ฃ์ด์คฌ๋ค๋ฉด, toolkit ์ ํ๋๋ก ํฉ์ณ์ก๋ค
๋ผ๋ ๋ถ๋ถ์ด ๊ฐ์ฅ ํฐ ๋ณ๊ฒฝ์ ์ด์ ์ฅ์ ์ด๋ผ๊ณ ์๊ฐํ๋ค.
์ฅํฉํ๊ฒ ๋์ด๋๋ ๊ฒ๋ณด๋จ, ๊ฐ์ ๊ธฐ๋ฅ์ด์ง๋ง ๊ฐ๋
์ฑ์ ์ฌ๋ฆฌ๊ธฐ ์ํด ๊ฐ๊ฒฐํ๊ฒ ์ฐ์ด๋ ๋ถ๋ถ์ด ๋ ์ข์ง ์๋..
( ๊ฐ๋ฐ์๋ผ๋ ์ง์
์ ๋ชฉํ๋ก ํ๋ค ๋ณด๋ ๋ญ๊ฐ ์ถํ์ ๋ด๊ฐ ์ด ์ฝ๋๊ฐ ์ง์ ๋ถํ๊ฑฐ๋ ๋๋ฌด ๊ธธ์ด ํ์ธํ๊ธฐ ์ด๋ ค์ฐ๋ฉด ์ข ๋ง์ด ๋ถํธํด์ง๋ ๊ฒ ๊ฐ๋ค. )
๊ทธ๋ฆฌ๊ณ ์ผ๋ฐ ๋ฆฌ๋์ค์์ ํ๋ ๊ฒ ์ฒ๋ผ export๋ฅผ ํตํด์ ๋ด๋ณด๋ด๊ณ ์ฌ์ฉํด์ผ๋๋ ์ปดํฌ๋ํธ์์ importํ๋ฉด ์ฌ์ฉ์ด ๊ฐ๋ฅํด์ง๋ค! ํ๋จ์ด ๊ทธ ์์ด๋ค
// ์ก์
ํฌ๋ฆฌ์์ดํฐ๋ ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ๊ธฐ ์ํด export ํ๊ณ
export const { addNumber, minusNumber } = counterSlice.actions;
// reducer ๋ configStore์ ๋ฑ๋กํ๊ธฐ ์ํด export default ํฉ๋๋ค.
export default counterSlice.reducer;
๊ทธ๋ฐ๋ฐ ์ด์ ์ vuex
๋ฅผ ์ผ๋ ๋์๊ฒ๋ ์์ง๋ ์ด ์๋ฐฉํฅ ๋ฐ์ดํฐ ์ ์ก
์ ๋ง์ ๋ชป์์ด ์ด์ง ๋ถํธํ ์ ์ด ์๋ค. ์ข ๋ ์ฌ๋ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ๋ฒ ์จ๋ณด๋ฉด ๋ด๊ฒ ๋ง๋ ์ ์ญ ์ํ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฐพ์ ์ ์์ง ์๋ ์ถ๋ค!
์ด ๋ถ๋ถ์ ํญํด99 ์ reference๋ฅผ ์ฐธ๊ณ ํ์ฌ ์ค์ค๋ก ๊ธฐ์ตํ๊ธฐ ์ํด ์์ฑํ์์ต๋๋ค.