[220707 / Day 38] React-Redux
React-Redux
Redux ํ์ด์ง์ Usage Guides : https://ko.redux.js.org/usage/index (์ฐธ๊ณ )
- redux ๋? ์ ์ญ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- ์ ์ญ์ํ๋ฅผ ์ ์ฅํ๋ store ๊ฐ ์์
- ํ๋์ ํ๋ก์ ํธ์ store ๋ ํ๋, ๊ทธ๊ฑธ ๋ด๋ state ๋ ์ฌ๋ฌ ๊ฐ.
- setState ์ญํ ์ ํ๋ ๊ฒ์ด action(๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ธฐ ์ํ ์์ฒญ, ๋ฏธ๋ฆฌ ์ง์ ํด๋ฌ์ผ ํจ)
- redux ๋ ๋ฆฌ์กํธ์ ์ข ์๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋๊ณ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ๋ ์์ํฌ, ๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ์ ํจ๊ป ์ฌ์ฉํ ์ ์์
1. Redux ๊ฐ ์๋ํ๋ ์์
- ์ปดํฌ๋ํธ์์๋ store ์์ ํ์ํ state ๊ฐ์ ๊ตฌ๋ ํด์ ์ฌ์ฉ (์๋๋ ์ ์ญ์ ์ผ๋ก state ๋ฅผ ๊ด๋ฆฌ๋ฅผ ํ ์ ์์, ํ์ง๋ง redex๋ ์ฌ์ฉ ๊ฐ๋ฅ)
- ์ํ๋ฅผ ๋ณ๊ฒฝ์์ผ์ผ ํ ๋ ๋ณ๊ฒฝํด์ผ ํ ์ ๋ณด๋ฅผ ๋ด์์ action ์ด๋ผ๋ ๊ฐ์ฒด๋ก ์์ฑ
- action ์ dispatch(์ฒ๋ฆฌ๋ ์์ ์ ์คํ์ํค๋ ๊ฒ, ๋ณด๋ด๋ ๊ฒ)ํด์ reducer ์ ๋๊ฒจ์ค
- reducer ๋ ๊ทธ ์ ๋ณด(action)๋ฅผ ๋ณด๊ณ state ๋ฅผ ์ ํด์ง ๊ท์น์ ๋ฐ๋ผ ๋ณ๊ฒฝํด์ค
- ์ต์ข ์ ์ผ๋ก ์ ์ญ state ๊ฐ ๋ณ๊ฒฝ๋๊ณ , ํด๋น state ๋ฅผ ๊ตฌ๋ ํ๊ณ ์๋ ์ปดํฌ๋ํธ๋ค์ ๋ณ๊ฒฝ๋ ์๋ก์ด state ๊ฐ์ ๋ฐ์, ํด๋น ์ปดํฌ๋ํธ๋ ๊ฐ์ด ๋ณ๊ฒฝ๋์๊ธฐ ๋๋ฌธ์ ๋ฆฌ๋๋๋ง๋จ.
2. redux ์ ์ธ๊ฐ์ง ์์น
https://velog.io/@seungmini/Redux%EC%9D%98-%ED%8A%B9%EC%A7%95-%EC%84%B8%EA%B0%80%EC%A7%80 (์ฐธ๊ณ )
1) single source of truth : ์ ๋ขฐ๊ฐ๋ฅํ ๋จ์ผ ์ถ์ฒ
๋ฐ์ดํฐ(state)๋ ์ ๋ขฐ๊ฐ๋ฅํ ๋จ์ผ ์ถ์ฒ๋ฅผ ๊ฐ์ ธ์ผ ํ๋ค.
๋ฐ์ดํฐ(state)๋ ์ฌ๋ฌ ๊ณณ์ ๋์ง ๋ง๊ณ ํ๋์ store ์ ๋๊ณ ๊ด๋ฆฌํด์ผ ํ๋ค๋ ๋ป
→ ์ค๋ณต๋ ๋ฐ์ดํฐ์ ์ํ ์ค๋ฅ๊ฐ ์ค์ด๊ณ ๋๋ฒ๊น ์ ์ฝ๊ฒ ํ๊ธฐ ์ํด์
2) state is read-only : ์ํ๋ ์ฝ๊ธฐ ์ ์ฉ
๋ฐ์ดํฐ์ ํ๋ฆ์ด ์๋ฐฉํฅ์ด ์๋ ๋จ๋ฐฉํฅ์ด์ด์ผ ํ๋ค.
state ๋ฅผ ๊ตฌ๋ ํ๋ค๊ฐ ๊ฐ์๊ธฐ ์ปดํฌ๋ํธ๋ฅผ ๋ฐ๊พธ๋ ๊ฒ์ด ์๋ ์ผ์ ๋ฐฉํฅ์ด ์์
action ์ด๋ผ๋ ๊ฐ์ฒด๋ฅผ ํตํด ๋ฐ์ดํฐ(state) ๊ฐ ๋ณ๊ฒฝ๋์ด์ผ ํจ
→ ์ด์ : ์ด ๋ฐ์ดํฐ(state)๊ฐ ์ด๋ค ๊ฒ์ ์ํด ๋ณ๊ฒฝ๋์๋์ง ๋ช ํํ๊ฒ ์ ์ ์์
3) changes are made with pure functions : reducer ๋ ์์ํ ํจ์
์์ํ ํจ์๋ ์ด๋ค ์ ๋ ฅ ๊ฐ์ด ์ ํด์ ธ ์์ ๋ ๊ฒฐ๊ณผ ๊ฐ์ ์์ธกํ ์ ์๋ ํจ์
์๋ฅผ ๋ค๋ฉด 2x2 ๋ฅผ ๋ฃ์ผ๋ฉด 4๋ผ๋ ๊ฐ์ด ๋์ค๋ ํจ์
random ํจ์๋ ๊ฒฐ๊ณผ๊ฐ์ ์์ธกํ ์ ์๊ธฐ ๋๋ฌธ์ ์์ธก ๋ถ๊ฐ. date ํจ์๋ ๊ทธ๋๊ทธ๋ ๋ ์ง๊ฐ ๋ฌ๋ผ์ง๊ธฐ ๋๋ฌธ์ ์์ธก ๋ถ๊ฐ. ๋ฐ๋ผ์ ๋์ ์์ ํจ์๊ฐ ์๋
์ ๋ ฅ๊ฐ์ด ์์ ๋ (action ์ด ์ ํด์ก์ ๋) ์ผ๊ด๋ ๊ฒฐ๊ณผ (random ํ์ง ์์ ๊ฒฐ๊ณผ) ๋ฅผ ๊ฐ์ง๊ณ ์์ผ ํจ
3. Redux ์ค์น : redux toolkit
- npm install @reduxjs/toolkit react-redux : reduxjs/toolkit ๊ณผ react-redux ๋ ๊ฐ๋ฅผ ์ค์นํ๋ ๊ฒ
- Redux DevTools : ํฌ๋กฌ ํ์ฅํ๋ก๊ทธ๋จ, action ์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ๋ณผ ์ ์๋๋ก ํ๋ ๊ฒ, ์์๊ฒ์ฌ์์ ๋ณผ ์ ์์
4. Redux ์คํ ์ค๋น
- store ํด๋์ index.js ํ์ผ ํ๋ ๋ง๋ค๊ณ Quick Start ์ Create a Redux Store ์ ์ฝ๋ ๋ณต์ฌํด์ ๋ถ์ฌ๋ฃ๊ธฐ → store ์ญํ ํ๋ ํ์ผ
- toolkit ์ผ๋ก ์ค์นํ๊ธฐ ๋๋ฌธ์ src ํด๋์ index.js ํ์ผ์ import ํด์ ์ฌ์ฉํ ๊ฒ์
- src ํด๋์ index.js ํ์ผ์ ๊ฐ์ import store from './store'; ์ import { Provider } from 'react-redux'; ํด์ฃผ๊ธฐ → store ์ index.js ํ์ผ
- <Provider store={store}> <App /> </Provider> → app.js ์ปดํฌ๋ํธ๊ฐ store ์ ์ ๊ทผํ ์ ์๋๋ก Provider๋ก ๊ฐ์ธ์ store ๋ด๋ ค์ฃผ๊ธฐ
- store ํด๋ ์์ counter ํด๋ ์์ counterSlice.js ํ์ผ ์์ฑ
- Redux ํ์ด์ง์ Create a Redux State Slice ์ ์ฝ๋ ๋ณต์ฌํด์ counterSlice.js ํ์ผ์ ๋ถ์ฌ๋ฃ๊ณ ์์ ํด์ ์ธ ๊ฒ์
5. counterSlice.js ํ์ผ
- incrementByAmount : ์ ์ธ๊ฑฐ๋๊น ์ง์ฐ๊ธฐ
- ๋ฏธ๋ฆฌ action ์ ์์ฒญํด๋๊ธฐ : increment, decrement ๋ผ๋ action ์ ์์ฒญ. ๋ฐ๋ผ์ state.value += 1 ๋ state.value -= 1 ๋ผ๋ ์์ฒญ์ ํ ์ ์๋ค๋ ๋ป
- ๊ทธ๋ฐ ์์ฒญ์ ๋ฐ์ ์ค์ง์ ์ผ๋ก ๊ฐ์ ์ฒ๋ฆฌํด์ฃผ๋ ํจ์๋ reducers ํจ์
- createSlice : ํดํท์์ ์ฌ์ฉํ๋ ํจ์, reducers(state๋ฅผ ์กฐ์ํ๋ ํจ์) ๋ฅผ ๋ด๊ณ ์์
- const initialState~ ๋ผ๊ณ ๋์ด ์๋ ํจ์๋ฅผ ๋ฐ๋ก ๋นผ๊ณ export ์์๋ initialState ๋ผ๊ณ ๋ถ๋ฌ์ ์ฃผ๊ธฐ
- increment ์ state ๋ผ๋ ์ธ์๋ฅผ ๊ฐ๊ณ ์๋ ๊ฒ์ (state, action) ์ด๋ผ๊ณ ํ๋ ๋ ๋ง๋ค์ด์ฃผ๊ธฐ
- reducers ์ ์ด๋ป๊ฒ ํจ์๋ฅผ ์กฐ์ํ ๊ฒ์ธ์ง ๋ฃ์ด์ค์ผ ํจ
- ์ธ์ state ๋ ํ์ฌ๊ฐ(๊ธฐ์กด value๊ฐ), ์ธ์ action๋ ๋ฐ์ดํฐ๊ฐ ์ ๋ฌ๋จ(์์ ์์ฒญ์ ๋ฐ๊ฒ ๋จ)
- state.value์ 1 ์ action.payload; ๋ก ์์ , ๊ทธ๋ฆฌ๊ณ action.type='SET_VALUE_INCREMENT' ์ ์ด์ฃผ๊ธฐ / decrement ์๋ ์ธ์ action ๋ฃ๊ณ , action.payload ์์ , action.type='SET_VALUE_DECREMENT' ์ ์ด์ฃผ๊ธฐ → ๋ณดํต type ์ ๋๋ฌธ์๋ก ๋ง๋ฌ
→ ๊ธฐ๋ณธ ์ธํ ๋
6. Quick Start ์์ ๋ก ๋ง๋ค์ด๋ณด๊ธฐ
- src ํ์ผ์ component ํด๋์ Counter ํด๋ ์์ index.js ํ์ผ ์์ฑ
- app.js ์ Counter ๋ฅผ import ํด์ฃผ๊ธฐ
- ๋ง๋ ํ์ผ ์์ rsc ํด์ฃผ๊ณ div ํ๊ทธ ์์ Redux ํ์ด์ง์ Use Redux State and Actions in React Components ์ button ํ๊ทธ ๋๊ฐ ๋ณต์ฌ ๋ถ์ฌ๋ฃ๊ธฐ ํด์ฃผ๊ธฐ
- ๋ง๋ ํ์ผ ์์ import { useSelector, useDispatch } from 'react-redux'; ํด์ฃผ๊ธฐ : react-redux ์์ ์ ๊ณตํ๋ ํ
- ๋ง๋ ํ์ผ ์์ const dispatch = useDispatch(); ํด์ฃผ๊ธฐ : dispatch ๋ง ํด์ฃผ๋ฉด useDispatch ํ ์ฌ์ฉ ๊ฐ๋ฅ
- action ์ธ์๋ฅผ ๋ฐ์ dispatch ๋ก ๋ณํ๋ฅผ ์์ฒญ : onClick={() => dispatch(๋ณํ)} / ์ก์ ์ง์ ๋ง๋ค ์ ์์ง๋ง ๋งค๋ฒํ๋ฉด ๊ท์ฐฎ๊ธฐ ๋๋ฌธ์ ์ก์ ์ ์์ฑํ๋ ํจ์ ํธ์ถ, ์ฆ action creator ํธ์ถ
- action creator ๋ ์ด๋ฏธ ๋ง๋ค์ด์ ธ ์์, counterSlice.js ์ ๊ฐ๋ณด๋ฉด ํ๋จ์ action ์์ฑ ํจ์๊ฐ export ๋๊ณ ์์ด action ์ ์์ฑํ ์ ์์
- counter ์ index.js ํ์ผ์ decrement, increment ๋ฅผ import ํด์ฃผ๊ธฐ
- ๊ฐ์ ธ์จ decrement, increment ๋ฅผ ๊ฐ๊ฐ onclick dispatch ํจ์์ ๋ฃ์ด์ฃผ๊ธฐ
- dispatch(increment(1)) ์ dispatch(decrement(1)) : 1๋ก ๊ฐ์ ์ค์ ํด์ฃผ๋ฉด payload ๋ก ๊ฐ์ด ์ ๋ฌ๋จ
7. counterSlice.js ํ์ผ
- createSlice : create reducers ์ create action ์ ํฉ์ณ๋์ ํ , redux toolkit ์์ ์ ๊ณต๋จ
- Immer ๋ผ์ด๋ธ๋ฌ๋ฆฌ : react ์์ ๋ถ๋ณ์ฑ์ ์ ์งํ๋ ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ์ฝ๊ฒ ํด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, ์ง๊ธ ์ฐ๋ฆฌ๋ tool kit ์ผ๋ก ์ค์นํ๊ธฐ ๋๋ฌธ์ ์ฐ์ง ์์๋ ๋จ
- type ์ action ์์ ๊ผญ ๋ค์ด๊ฐ์ผ ํ๋ ์์ฑ, type ์ ์ด๋ค reducer ๋ก ๊ฐ์ผ ํ๋์ง ๊ฒฝ๋ก๋ฅผ ์ ํด์ฃผ๊ธฐ ๋๋ฌธ์ ๊ผญ ์์ด์ผ ํจ
8. store ํด๋์ index.js ํ์ผ (store ์ญํ ํ๋ ํ์ผ)
- counterSlice.js ํ์ผ์ import
- reducer ์ counter : counterSlice ์ ๋ ฅ
- counter ๋ผ๋ reducer, ๊ทธ๋ฆฌ๊ณ counterSlice ๋ฅผ ์ฐ๊ฒฐํ ๊ฒ
9. Counter ํด๋์ index.js ํ์ผ
- {count} ๊ฐ ๋นจ๊ฐ ์ค ์ณ ์์ ๊ฑฐ์
- count ๋ ์ต์ข ์ ์ผ๋ก ๊ฐ์ ธ์ค๋ state ๊ฐ์
- store ํ์ผ์์ ๋ณด๋ธ state ๊ฐ์ ๊ตฌ๋ ํด์ผ ์ฐ๊ฒฐ์ด ๋จ
- useSelector ๋ผ๋ ํ ์ store ์์ ๊ตฌ๋ ํ๋ ์ญํ ์ ํด์ค
- const count = useSelector(state => state.counter.value); → counter ๋ผ๋ ๊ฐ์ ์ด๋์ ์๋์ง? store ํ์ผ์ counter ๊ฐ์์ ์ด
10. ํ์ฅํ๋ก๊ทธ๋จ dev tools ์์ ๋ณด๋ฉด์ ํ์ธํด๋ณผ ๊ฒ
- toolkit ์ค์น ์์ ์ฑ๋ก dev tool ์ฌ์ฉํ๋ ค๋ฉด npm ์ผ๋ก ์ค์นํด์ ๋ค์ ์ค์ ํด์ค์ผ ํจ
์์ ๊ฒ์ฌ๊ฐ์ Redux ๋์ผ๋ก ๊ฐ๋ณด๋ฉด
- action : ์ด๋ป๊ฒ ์ฐ๊ฒฐ๋์ด ๋ค์ด๋์ง ๋ณด์
- diff : ์ด๋ป๊ฒ ๊ฐ์ด ๋ณ๊ฒฝ๋๋์ง ๋ณด์
- state : ์ด๋ป๊ฒ state ๊ฐ ์๋๋๋์ง ๋ณด์
- ํ๋จ์ ํ์ดํ go back, go forward : ๋๋ฌ๋ณด๋ฉด ์ด์ , ์ดํ๋ก ํ์๋ผ์ธ ๋์๊ฐ
- chart : type ๊ณผ payload ๊ฐ ๊ฐ์ง ํํ๋ก ๋์ด
- raw : type ๊ณผ payload ๊ฐ ๊ฐ์ฒด ํํ๋ก ๋์ด
11. payload
- ๊ณ ์ ํ์ง ์์ ๊ฐ์ผ๋ก ์ด๋ค ๋ณ๊ฒฝ ์ฌํญ์ ์ถ๊ฐํด์ฃผ๊ธฐ ์ํด ์ค์ ํ ๊ฒ
- payload ๊ฐ์ ๊ผญ ๋ฃ์ด์ผ ํ๋ ๊ฒ์ ์๋, ๋ณ๊ฒฝ์ด๋ ์ถ๊ฐ ์ฌํญ์ด ์์ผ๋ฉด state.value ์ ๊ฐ์ ๊ณ ์ ํด๋๊ณ onclick ๋ณด๋ผ ๋ increment ์๊ดํธ ์์ ์๋ฌด๊ฒ๋ ์๋ฃ์ด๋ ๋จ
** ๊ณผ์ : ์ค๋ redux ์์ ํผ ๊ฒ ์ฐ์ตํด๋ณด๊ธฐ