๊ด€๋ฆฌ ๋ฉ”๋‰ด

๐Ÿ–ฅ dev-ruby

[๋ฆฌ์•กํŠธ]๋ฆฌ๋•์Šค(Redux) ๋Š” ๋ฌด์—‡์ผ๊นŒ? | ๋ฆฌ๋•์Šค๋ฅผ ์™œ ์‚ฌ์šฉํ• ๊นŒ? ๋ณธ๋ฌธ

React

[๋ฆฌ์•กํŠธ]๋ฆฌ๋•์Šค(Redux) ๋Š” ๋ฌด์—‡์ผ๊นŒ? | ๋ฆฌ๋•์Šค๋ฅผ ์™œ ์‚ฌ์šฉํ• ๊นŒ?

ruby_s 2021. 12. 22. 20:39
728x90
๋ฐ˜์‘ํ˜•
SMALL

๐Ÿค” ๋ฆฌ๋•์Šค๋ž€?

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ƒํƒœ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ฃผ๋Š” ๋„๊ตฌ์ด๋‹ค.
๋ณต์žกํ•œ ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ์ด๋ฃจ์–ด์ง€๋Š” SPA(Single Page Application)์—์„œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋œ๋‹ค.
๋ฆฌ๋•์Šค๋Š” ๋ฆฌ์•กํŠธ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ jQuery, Angular ๋“ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
๋‚˜๋Š” ๋ฆฌ์•กํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฆฌ๋•์Šค์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฒƒ์ด๋‹ค !

๋ฆฌ์•กํŠธ์˜ ๋ฐ์ดํ„ฐ ํ๋ฆ„์€ ๋‹จ๋ฐฉํ–ฅ์ด๊ธฐ ๋•Œ๋ฌธ์—, ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ ์•ˆ์— ์กด์žฌํ•˜๋Š” ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋“ค์€ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๋ฅผ props๋กœ ์ „๋‹ฌ๋ฐ›๊ฒŒ ๋œ๋‹ค.
๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๊ฐ’์ด ๋ณ€ํ•˜๊ฒŒ ๋˜๋ฉด, ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋Š” ๋ณ€ํ™”๋œ ์ƒํƒœ์— ๋งž๊ฒŒ data๋‚˜ ui๋ฅผ ๋ณ€๊ฒฝํ•œ๋‹ค. ์ฆ‰, ๋ฆฌ๋žœ๋”๋ง์„ ํ•œ๋‹ค.

์—ฌ๊ธฐ์„œ! ์ปดํฌ๋„ŒํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ ๋ฆฌ๋žœ๋”๋ง ๋œ๋‹ค.

1. ์ž์‹ ์˜ ์ƒํƒœ(state)๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ
2. ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋žœ๋”๋ง๋  ๋•Œ
3. ์ž์‹ ์ด ์ „๋‹ฌ๋ฐ›์€ props๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ
4. ๊ฐ•์ œ ์—…๋ฐ์ดํŠธ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋  ๋•Œ

์ฆ‰, ์œ„์™€ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๊ฐ’์ด ๋ณ€ํ•œ๋‹ค๋ฉด, ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๋Š” ๋ฆฌ๋žœ๋”๋ง ๋  ๊ฒƒ์ด๊ณ , ์ž์‹ ์ปดํฌ๋„ŒํŠธ ๋˜ํ•œ ๋ฆฌ๋žœ๋”๋ง ๋œ๋‹ค.


๐Ÿ” Redux๋ฅผ ์“ฐ๋Š” ์ด์œ 

1. ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋“ค์ด props๋ฌธ๋ฒ• ์—†์ด state๋ฅผ ์ง์ ‘ ๊บผ๋‚ด์“ธ ์ˆ˜ ์žˆ์Œ -> ๋ถ€๋ชจ ์ž์‹ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์˜ ํŽธ๋ฆฌ์„ฑ์„ ์œ„ํ•ด
2. ์ƒํƒœ(state) ๊ด€๋ฆฌ์˜ ์šฉ์ด -> store์•ˆ์— state์ˆ˜์ • ๋ฐฉ๋ฒ•์„ ๋ฏธ๋ฆฌ ์ •์˜ํ•ด๋‘”๋‹ค. ์ปดํฌ๋„ŒํŠธ๋“ค์€ ์ง์ ‘ state๋ฅผ ์ง์ ‘ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ์ˆ˜์ • ์š”์ฒญ๋งŒ ๋ณด๋‚ด์„œ ๊ทธ๋ƒฅ ๊ฐ€์ ธ์™€์“ฐ๋ฉด ๋œ๋‹ค.

๐Ÿ’ก ์žฅ์ 

๋ฒ„๊ทธ๊ฐ€ ์ผ์–ด๋‚ฌ์„ ๋•Œ ์ถ”์ ์ด ์‰ฌ์›€. ๋ฒ„๊ทธ๊ฐ€ ์ƒ๊ธฐ๋ฉด ๋ฒ”์ธ์€ ๋ฌด์กฐ๊ฑด store.js์ž„.

 

์—ฌ๊ธฐ์„œ, ์ž์‹์€ ๋ถ€๋ชจ์˜ ์ƒํƒœ๋ฅผ ๋ง‰ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค. props๋ฌธ๋ฒ•์„ ํ†ตํ•ด ์ „๋‹ฌ๋ฐ›์€ ์ƒํƒœ๋งŒ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.
๋”ฐ๋ผ์„œ, ์ปดํฌ๋„ŒํŠธ๊ฐ€ 100๊ฐœ ์ค‘์ฒฉํ•ด์„œ ์žˆ๋‹ค๋ฉด state๋ฅผ ์ „๋‹ฌํ•ด์ฃผ๊ธฐ ์œ„ํ•ด ์—„์ฒญ๋‚˜๊ฒŒ ๋งŽ์€ props๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.
๋ฆฌ๋•์Šค๋ฅผ ์„ค์น˜ํ•˜๋ฉด ์ด ์•ˆ์— ์ƒํƒœ๋“ค์„ ๋‹ค ์ €์žฅํ•ด๋‘์–ด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ•„์š”ํ•  ๋•Œ ๊บผ๋‚ด์“ธ ์ˆ˜ ์žˆ๋‹ค.

์„ค์น˜

npm install redux

์„ธํŒ… (์ดํ•ดํ•  ํ•„์š” X, ๋ฐฉ๋ฒ•์ผ ๋ฟ)

: ๋ชธ๋ฌด๊ฒŒ ์ฆ๊ฐ€๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด ์„ค๋ช…ํ•˜๊ฒ ๋‹ค

import { Provider } from 'react-redux'
import { createStore } from 'redux'

function reducer(state = 100, action){
  return state;
}

let store = createStore(reducer);

ReactDOM.render(
  <React.StricMode>
    <Provider store={store}>
      <App/>
    </Provider>
  </React.StricMode>
  document.getElementById('root')
);

 

๐Ÿ”จ ์ปดํฌ๋„ŒํŠธ์—์„œ store์— ์žˆ๋˜ state๋ฅผ ์“ฐ๋Š” ๋ฐฉ๋ฒ•

: useSelector๋กœ ๋ฆฌ๋•์Šค์˜ state๋ฅผ ์กฐํšŒํ•œ๋‹ค.

function App(){
  const ๊บผ๋‚ด์˜จ๊ฑฐ = useSelect((state) => state);
}

 

index.js
: store์— state ์ˆ˜์ •๋ฐฉ๋ฒ•์„ ๋ฏธ๋ฆฌ ์ •์˜ํ•œ๋‹ค.

function reducer(state = ์ฒด์ค‘, action){
  switch (action.type) {
    case '์ฆ๊ฐ€':
      return state + 1
    case '๊ฐ์†Œ':
      return state - 1
    default:
      return state
  }
}

 

์ปดํฌ๋„ŒํŠธ์—์„œ state ์ˆ˜์ • ์š”์ฒญํ•˜๋Š” ๋ฒ•

: dispatch ์‚ฌ์šฉ

const dispatch = useDispatch();
...
return (
  <button onClick={()=>{ dispatch({type: '์ฆ๊ฐ€'}) }}>๋”ํ•˜๊ธฐ</button>
)

ํด๋ฆญ๋งˆ๋‹ค 1์”ฉ ์ฆ๊ฐ€ํ•˜๊ฒŒ ๋œ๋‹ค.

 

Vuex๋ž‘ ๊ฐ™์€ ๊ฐœ๋…์œผ๋กœ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค !

 

๊ณต์‹๋ฌธ์„œ

https://ko.redux.js.org/introduction/getting-started/

 

Redux ์‹œ์ž‘ํ•˜๊ธฐ | Redux

์†Œ๊ฐœ > ์‹œ์ž‘ํ•˜๊ธฐ: Redux๋ฅผ ๋ฐฐ์šฐ๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ž๋ฃŒ

ko.redux.js.org

 

728x90
๋ฐ˜์‘ํ˜•
LIST