๐ฌ ์๋ฌ ๋ฉ์์ง ๊ฒธ ์ฐธ๊ณ ํ stackoverflow ๋งํฌ
Immer An immer producer returned a new value *and* modified its draft. Either return a new value *or* modify the draft
๋ฆฌ๋์ค ํดํท์ ์ฌ์ฉํ๋ค๋ฉด, ๋ค์๊ณผ ๊ฐ์ ๋ฉ์์ง๋ฅผ ๋ณด๊ฒ ๋๋ ๊ฒฝ์ฐ๊ฐ ์๋ค. ์คํ ์ค๋ฒ ํ๋ก์ฐ์์ ๊ทธ ํด๋ต์ ์ฐพ์๋ค.
โ ์๋ฌ ์์ธ ํํธ: redux toolkit์ ์ฌ์ฉํ๋ฉด ๋ด์ฅ๋ ๊ธฐ๋ฅ ์ค์ immer๋ผ๋ ๊ฒ์ด ์๋ค.
โญ immer
redux-toolkit ์ฌ์ฉ ์ ์ฌ์ฉ์๊ฐ ์๋ณธ state๋ฅผ ๊ฑด๋๋ ค๋ ๋ด๋ถ์์ ์๋ณธ state๋ฅผ ๋ณ๊ฒฝํ์ง ์๋๋ก ์์์ ๊ด๋ฆฌํด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. ์ฆ redux-toolkit ๋ด์ฅ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(?)๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
โญ ์์ธ
์ ๊ฐ์ ๋ฐํํ๋ฉด์ ์๋ณธ๋ ์์ ํ๊ธฐ ๋๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ ์๋ฌ๊ฐ ๋ฌ๋ ๊ฒ์ด๋ค. ์์ ์ ๊ฐ์ ์ ๋ฌํ๊ณ ์ถ์ ๊ฒ์ธ์ง ์๋๋ฉด ์์ ํ ์๋ณธ์ ์ ๋ฌํ๊ณ ์ถ์ ๊ฒ์ธ์ง ํดํท์ ํ๋จํ ์ ์์ด ์ถฉ๋์๋ฌ๊ฐ ์ผ์ด๋ฌ๋ค๊ณ ๋ณด๋ฉด ๋๋ค.
(์ฝ๋๋ ๋ฌธ์ ์ฝ๋๋ ํด๊ฒฐ์ฝ๋๋ ๊ฐ์ด ์์ด์ ๋ฐ์ ์ฒจ๋ถํ์์ต๋๋ค.)
โญ ํด๊ฒฐ๋ฐฉ๋ฒ

โ ๋ฐฉ๋ฒ A : ์๋ณธ๋ง ์์ ํ๊ณ return๋ฌธ ์ฐ์ง ์๊ธฐ.
โ ๋ฐฉ๋ฒ B : ์์ ์๋ฒฝํ๊ฒ ์๋ก์ด ์ฐธ์กฐํ ๋ฐ์ดํฐ ๋ง๋ค์ด์ ๋ฐํํ๊ธฐ
๊ทธ๋ฐ๋ฐ ๋ฐฉ๋ฒ A๋ฅผ ์ฐ๋ ๊ฒ ์ข๋ค๊ณ ํ๋ค. ์๋ํ๋ฉด B๋ ์๋ณธ๊ณผ ๊ด๋ จ์ด ์๋ ์์ ํ ๊น์ ๋ณต์ฌ๋ฅผ ์ํํ๊ณ ์๋ก์ด ์ฐธ์กฐํ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํด์ผํ๊ธฐ ๋๋ฌธ์ด๋ค. ์์ ํ ๊น์ ๋ณต์ฌ๋ ์๋ก์ด ๋ฐฐ์ด์ด๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ ํ๋ํ๋ ๋ณต์ฌํด์ ํด์ผ ํ๋ ์ ๋ง ๊ท์ฐฎ์ ๊ณผ์ ์ด๊ธฐ ๋๋ฌธ์ ๋ฐฉ๋ฒA๋ฅผ ์ฐ๋ ๊ฒ์ด ํจ์ฌ ํธ๋ฆฌํ๊ณ ์ข๋ค.
์ดํด๋ฅผ ์ํด ์ฝ๋ ์ค๋ํซ(๋ฐฉ๋ฒA๋ฅผ ์ฌ์ฉ)์ ์ฒจ๋ถํ๋ค. ์ผ๋ถ๋ถ๋ง ๊ฐ์ ธ์จ ๊ฒ์ด๋ค.
const todosSlice = createSlice({
name: "todo",
initialState,
reducers: {
addContent: (state, action) => {
const id = state.total.length
? state.total[state.total.length - 1].id + 1
: 0;
const title = action.payload.title,
desc = action.payload.desc;
let newCard;
if (title === "" || desc === "") {
alert("์ ๋ชฉ ๋๋ ๋ด์ฉ์ด ๋น์ด์๋์ง ํ์ธํด์ฃผ์ธ์!");
// return state;
} else {
newCard = {
title,
desc,
id,
done: false,
};
// immer ๊ฐ ๋ถ๋ณ์ฑ ๊ด๋ฆฌ ์์์ ํด์ค. ๋ฐ์ return ์ฃผ์์ ์์ ์ ์ฝ๋!
state.total.push(newCard);
// return { ...state, total: [...state.total, newCard] } // ์ค์!โญ ๊ฐ์ฒด๋ ๋จผ์ ํ ๋ฒ ๋ฟ๋ฆฌ๊ณ ๋ค์์ ํ๋กํผํฐ ์ฐพ์์ ๋ฐ๊พธ๋ ์์ผ๋ก ์๊ฐ.
}
},
}
})
๋ฆฌ๋์ค ํดํท์ ์ ๋ง ์ฌ๊ธฐ์ ์ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋๊ฐ? ๋ถ๋ณ์ฑ ๊ด๋ฆฌ๋ฅผ ์์์ ํด์ค๋ค๋...์ ๊ฒฝ ์์ฐ๊ณ ๋ก์ง์ ์งค ์ ์๊ฒ ๋๋ค. (๋ฌผ๋ก immer๋ ์ฐพ์๋ณด๋ฉด ์ฝ๊ฐ์ ์๋ ์ ํ ๋ฌธ์ ๊ฐ ์๊ธด ํ๋ค๊ณ ํจ!)