Jane K 2022. 7. 7. 12:22

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 ์˜ˆ์ œ ํ‘ผ ๊ฒƒ ์—ฐ์Šตํ•ด๋ณด๊ธฐ