๐Ÿ‘พ Redux

๊ถŒ๊ทœ๋ฆฌยท2023๋…„ 6์›” 5์ผ
1

๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ปFrontEnd

๋ชฉ๋ก ๋ณด๊ธฐ
22/29
post-thumbnail

01. Redux๋Š” ๋ฌด์—‡์ผ๊นŒ?

๐Ÿ“1. ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€์˜ Redux ์ •์˜

  • Redux๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์•ฑ์„ ์œ„ํ•œ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์ƒํƒœ ์ปจํ…Œ์ด๋„ˆ์ด๋‹ค.

  • Redux๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ผ๊ด€์ ์œผ๋กœ ๋™์ž‘ํ•˜๊ณ , ์„œ๋กœ ๋‹ค๋ฅธ ํ™˜๊ฒฝ(์„œ๋ฒ„, ํด๋ผ์ด์–ธํŠธ)์—์„œ ์ž‘๋™ํ•˜๊ณ , ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์‰ฌ์šด ์•ฑ์„ ์ž‘์„ฑํ•˜๋„๋ก ๋„์™€์ค€๋‹ค.

  • Redux๋Š” ๋ฆฌ์•กํŠธ๋งŒ์„ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์•„๋‹ˆ๋‹ค. React ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Vue์™€๋„ ์ž˜ ๊ฒฐํ•ฉ๋˜๋ฉฐ, ๋˜ํ•œ ์ˆœ์ˆ˜ JS์™€๋„ ๊ฒฐํ•ฉ์ด ๋œ๋‹ค.


๐Ÿ“Œ2. Redux๋Š” ์„ค์น˜ ์—†์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

  • ๋ฐ‘์— ํ•œ ์ค„์„ ํ—ค๋” ๋ถ€๋ถ„์— ์ž…๋ ฅํ•˜๋ฉด ๋œ๋‹ค.
<script src="https://cdnjs.cloudflare.com/ajax/libs/redux/4.0.1/redux.js"></script>

02. ๋‚ด๊ฐ€ ์ดํ•ดํ•œ Redux

๐Ÿ”Ž 1. Redux์˜ ํŠน์ง•

  • Redux๋Š” state ๊ฐ์ฒด์—์„œ ์ค‘์•™ ์ง‘์ค‘์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ณต์žก์„ฑ์„ ์ค„์—ฌ์ค€๋‹ค.

  • state ๊ฐ์ฒด๋Š” ์™ธ๋ถ€์—์„œ ์ง์ ‘์ ์œผ๋กœ ์ œ์–ดํ•  ์ˆ˜ ์—†๋‹ค.
    ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์—, state์˜ ๊ฐ’์ด ๋ณ€ํ•˜๋Š” ๊ฒƒ์„ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค.


๐Ÿ”Ž 2. Redux์˜ ๊ธฐ๋ณธ์ ์ธ ํ๋ฆ„

1. ํ•˜๋‚˜์˜ ์ค‘์•™ ๋ฐ์ดํ„ฐ store์„ ๊ฐ–๋Š”๋‹ค.

  • store์—๋Š” ์ €์žฅํ•˜๊ณ ์‹ถ์€ ์‚ฌ์šฉ์ž์˜ ์ƒํƒœ๋ฅผ ์ €์žฅํ•œ๋‹ค.
  • store์€ ํ•œ ๊ฐœ์˜ ํ”„๋กœ์ ํŠธ์— ํ•˜๋‚˜๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.
  • store์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” reducer ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๊ณต๊ธ‰ํ•ด์ค˜์•ผ ํ•œ๋‹ค.
  • ๐Ÿ“Œ์ƒ์„ฑ๋ฐฉ๋ฒ• : let store = Redux.createStore(reducer);

2. ์ƒํƒœ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•  ๋•Œ state์˜ ๊ฐ’์„ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด reducer ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

  • reducer์€ state , action ๋‘ ๊ฐœ์˜ ๊ฐ’์„ ์ธ์ž๋กœ ๋ฐ›๋Š”๋‹ค.
  • ์ด ๋•Œ state๋Š” ๊ธฐ์กด์˜ state ๊ฐ’์ด๊ณ  , action์€ ์›น์—์„œ ๋ณ€๊ฒฝ๋œ ๊ฐ’์ด๋‹ค.
  • reducer์€ ๋‘ ๊ฐœ์˜ ์ธ์ž๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ์šด state ๊ฐ’์„ ๋งŒ๋“ค์–ด return ํ•œ๋‹ค.
  • ๐Ÿ“Œ์ƒ์„ฑ๋ฐฉ๋ฒ• : function reducer(state, action) { }

๐Ÿฆ ์ƒ์„ฑ ์‹œ ์ฃผ์˜ํ•  ์  : ๊ธฐ์กด์˜ state ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜์—ฌ return ํ•˜์ง€ ๋ง๊ณ  , ๊ธฐ์กด์˜ state๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ๋ณต์‚ฌ๋ณธ์„ ๋ณ€๊ฒฝํ•˜์—ฌ return ํ•œ๋‹ค.

๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•  ๋•Œ๋Š” Object.assign({}, state, ... ) ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.
๐Ÿ“ ์—ฌ๊ธฐ์„œ ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋Š” ๋ฐ˜๋“œ์‹œ ๋นˆ๊ฐ์ฒด๋ฅผ ์ฃผ๊ณ , ๋‘ ๋ฒˆ์งธ ์ธ์ž๋ถ€ํ„ฐ๋Š” ๋นˆ๊ฐ์ฒด์— ๋ณต์ œํ•  ์†์„ฑ์„ ๊ฐ€์ง„ ๊ฐ์ฒด๋ฅผ ์ฃผ๋ฉด ๋œ๋‹ค.

3. dispatch๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ state์˜ ๊ฐ’์„ ์ˆ˜์ •ํ•˜๋ผ๊ณ  reducer์—๊ฒŒ action๊ณผ ํ•จ๊ป˜ ์š”์ฒญํ•œ๋‹ค.

  • action ๊ฐ์ฒด๋Š” ๋ฐ˜๋“œ์‹œ type ํ•„๋“œ๋ฅผ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค.
  • ๊ทธ ์ด์œ ๋Š” reducer ํ•จ์ˆ˜๊ฐ€ ์ด type ๊ฐ’๊ณผ ์ด์ „์˜ state ๊ฐ’์„ ์ฐธ๊ณ ํ•˜์—ฌ ์ƒˆ๋กœ์šด state ๊ฐ’์„ ๋งŒ๋“ค์–ด๋‚ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ๐Ÿ“Œ์˜ˆ์‹œ : store.dispatch({type:'CHANGE_COLOR'});

4. reducer๊ฐ€ state์˜ ๊ฐ’์„ ์ˆ˜์ •ํ•˜๋ฉด subscribe๋ฅผ ํ†ตํ•ด render์—๊ฒŒ ์ „๋‹ฌํ•˜์—ฌ ์ƒˆ๋กญ๊ฒŒ ์ˆ˜์ •๋œ ๋ถ€๋ถ„์„ UI์— ๊ฐฑ์‹ ํ•ด์ค€๋‹ค.

  • subscribe๋Š” state ๊ฐ’์ด ๋ฐ”๋€Œ๋ฉด ๋ฐ”๋€ ๊ฒƒ์„ UI์— ์—…๋กœ๋“œ ํ•ด์ค€๋‹ค.
  • ๐Ÿ“Œ์ƒ์„ฑ๋ฐฉ๋ฒ• ๋ฐ ์˜ˆ์‹œ : function red() { ... ์ค‘๋žต ... } store.subscribe(red);

๐Ÿ“ ์ถ”๊ฐ€๋กœ render์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ๋ฅผ ํ•˜์ž๋ฉด.

render์€ ์šฐ๋ฆฌ๊ฐ€ '์งค' ์ฝ”๋“œ์ด๋‹ค. render์€ store์˜ ์™ธ๋ถ€์— ์œ„์น˜ํ•ด ์žˆ๊ณ , state์—๊ฒŒ ์ง์ ‘์ ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์œผ๋‹ˆ getState๋ฅผ ํ†ตํ•ด state์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ , dispatch๋ฅผ ํ†ตํ•ด ๊ฐ’์„ ๋ณ€๊ฒฝ ์‹œํ‚ค๊ณ , subscribe๋ฅผ ํ†ตํ•ด ๊ฐฑ์‹ ํ•œ๋‹ค.

๐Ÿ“Œ render์—์„œ state ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ณ , innerHTML์„ ํ†ตํ•ด state ๊ฐ’์„ ์ด์šฉํ•ด ์›น ํŽ˜์ด์ง€๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

  • let state = store.getState();
  • document.querySelector("#").innerHTML = ~
profile
๊ธฐ๋ก์žฅ ๐Ÿ“

0๊ฐœ์˜ ๋Œ“๊ธ€