๐Ÿ–ฅFrontEnd/Redux

์ฝ”๋“œ๋กœ ๋ณด๋Š” ๋ฆฌ๋•์Šค ๊ธฐ์ดˆ

hellohailie 2022. 7. 10. 15:34

 

๋ฆฌ๋•์Šค ์ฒ˜์Œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ธฐ

 

๋ชจ๋“ˆ ์„ค์น˜ํ•˜๊ธฐ

npm i redux react-redux

 

๋ฆฌ๋•์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด require๋กœ ๋ถˆ๋Ÿฌ์˜จ๋‹ค. 

const redux = require("redux");

์ €์žฅ์†Œ ๋งŒ๋“ค๊ธฐ

const store = redux.createStore();

์ €์žฅ์†Œ ๋งŒ๋“ค๊ธฐ (๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•จ)(๊ด€๋ฆฌํ•˜๋Š” ๋ฐ์ดํ„ฐ๋Š” ๊ฒฐ๊ตญ ๋ฆฌ๋“€์„œ ํ•จ์ˆ˜์— ์˜ํ•ด ๊ฒฐ์ •๋œ๋‹ค.๋ฆฌ๋“€์„œ ํ•จ์ˆ˜๊ฐ€ ์ƒˆ๋กœ์šด ์ƒํƒœ ์Šค๋ƒ…์ƒท์„ ์ƒ์„ฑํ•˜๋‹ˆ๊นŒ)
(๋ฆฌ๋“€์„œ๋Š” ์•ก์…˜์ด ๋„์ฐฉํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์ƒํƒœ ์Šค๋ƒ…์ƒท์„ ๋ฑ‰์–ด๋‚ด์•ผ ํ•œ๋‹ค.)

 


๋ฆฌ๋“€์„œ ํ•จ์ˆ˜ ๋งŒ๋“ค๊ธฐ
const counterReducer = (state = { counter: 0 }, action) => {
  return {
   counter: state.counter + 1,
  };
};

โžฅ ์œ„ ํ•จ์ˆ˜ ํ•ด์„: ์šฐ๋ฆฌ๊ฐ€ ์ž๋™์œผ๋กœ ๋ฐ›๋Š” ๊ธฐ์กด ์ƒํƒœ๋ฅผ ์ฐธ์กฐํ•˜๊ณ , ์ƒํƒœ์— ์ €์žฅ๋œ ๊ธฐ์กด์˜ counter ๊ฐ’์— ์•ก์„ธ์Šคํ•˜๊ณ , ์ƒˆ๋กœ ๋ฆฌํ„ด๋œ ์ƒํƒœ์˜ ์ƒˆ๋กœ์šด counter ๊ฐ’์œผ๋กœ์„œ ๊ฑฐ๊ธฐ์— 1์„ ๋”ํ•œ๋‹ค.

 

โญ๏ธโญ๏ธ

๋ฆฌ๋“€์„œ ํ•จ์ˆ˜๋Š” ํ‘œ์ค€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ•จ์ˆ˜์ง€๋งŒ, ๋ฆฌ๋•์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์˜ํ•ด ํ˜ธ์ถœ๋  ๊ฑฐ๋‹ค. ํ•ญ์ƒ 2๊ฐœ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ›๋Š”๋‹ค. (๊ธฐ์กด์˜ ์ƒํƒœ์™€ ๋ฐœ์†ก๋œ ์•ก์…˜)
๊ทธ๋ฆฌ๊ณ  ์ด ๋ฆฌ๋“€์„œ ํ•จ์ˆ˜๋Š” ์–ด๋–ค ์ถœ๋ ฅ์„ ๋ฆฌํ„ดํ•ด์•ผ๋งŒ ํ•œ๋‹ค. ํ•ญ์ƒ ์ƒˆ๋กœ์šด ์ƒํƒœ ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•ด์•ผ๋งŒ ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ๋ฆฌ๋“€์„œ ํ•จ์ˆ˜๋Š” ์ˆœ์ˆ˜ํ•œ ํ•จ์ˆ˜๊ฐ€ ๋˜์–ด์•ผ ํ•œ๋‹ค.
(์ˆœ์ˆ˜ํ•จ์ˆ˜: ๋™์ผํ•œ ์ž…๋ ฅ๊ฐ’์„ ๋„ฃ์œผ๋ฉด ํ•ญ์ƒ ์ •ํ™•ํžˆ ๊ฐ™์€ ์ถœ๋ ฅ์ด ์‚ฐ์ถœ๋œ๋‹ค. ์–ด๋– ํ•œ side effect๊ฐ€ ์—†๋‹ค. )
์˜ˆ๋ฅผ๋“ค์–ด HTTP์š”์ฒญ์„ ์ „์†กํ•œ๋‹ค๊ฑฐ๋‚˜ ๋ญ”๊ฐ€๋ฅผ ๋กœ์ปฌ ์ €์žฅ์†Œ์— ๊ธฐ๋กํ•œ๋‹ค๊ฑฐ๋‚˜ ๋กœ์ปฌ์ €์žฅ์†Œ์— ๋ญ”๊ฐ€๋ฅผ ๊ฐ€์ ธ์˜ค์ง€ ๋ง์•„์•ผํ•œ๋‹ค.
๋Œ€์‹ ์— ๋ฆฌ๋“€์„œ๋Š” ๋ฆฌ๋•์Šค๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ž…๋ ฅ์„ ์ทจํ•˜๊ณ  ์˜ˆ์ƒ๋œ ์ถœ๋ ฅ๋ฌผ์ธ ์ƒˆ๋กœ์šด ์ƒํƒœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ˆœ์ˆ˜ํ•จ์ˆ˜๊ฐ€ ๋˜์–ด์•ผ ํ•œ๋‹ค.

๋ฆฌ๋“€์„œ ํ•จ์ˆ˜์˜ ์ถœ๋ ฅ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ์ฒด! ๊ทธ ์ด์œ ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ƒํƒœ๋Š” ํ•˜๋‚˜์˜ ๊ฐ’ ์ด์ƒ์„ ์˜๋ฏธํ•˜๊ธฐ ๋•Œ๋ฌธ! ํ•˜์ง€๋งŒ ์ด๋ก ์ ์œผ๋กœ๋Š” ์–ด๋– ํ•œ ๊ฐ’ ์œ ํ˜•๋„ ๊ฐ€๋Šฅ!

โญ๏ธโญ๏ธโญ๏ธ

๋ฆฌ๋“€์„œ ํ•จ์ˆ˜์— state={conuter:0}๋ผ๊ณ  state ํŒŒ๋ผ๋ฏธํ„ฐ์— ๊ธฐ๋ณธ๊ฐ’์„ ์ค€ ์ด์œ !

 

state ํŒŒ๋ผ๋ฏธํ„ฐ์— ๊ธฐ๋ณธ๊ฐ’์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค๋ฉด "Cannot read properties of undefined (reading 'counter')" ์˜ค๋ฅ˜ ๋ฐœ์ƒ!

 

createStore๋ฅผ ์ด์šฉํ•ด์„œ ์ €์žฅ์†Œ๋ฅผ ๋งŒ๋“ค์—ˆ๊ณ , ๊ทธ ์ €์žฅ์†Œ์— ํ•„์š”ํ•œ counterReducer๊ฐ€ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๋ฆฌ๋“€์„œ์— ์šฐ๋ฆฌ๋Š” ์ƒํƒœ ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค. ๊ธฐ์กด ์ƒํƒœ ์นด์šดํ„ฐ์— 1์„ ๋”ํ•ด์„œ ์นด์šดํ„ฐ๋ฅผ ์„ค์ •ํ•œ๋‹ค. ๊ทธ ์ €์žฅ์†Œ๊ฐ€ ์ดˆ๊ธฐํ™”๋  ๋•Œ ๋ฆฌ๋•์Šค๊ฐ€ ์ด ๋ฆฌ๋“€์„œ๋ฅผ "์ฒ˜์Œ์œผ๋กœ" ์‹คํ–‰ํ•œ๋‹ค๋Š”๊ฒŒ ๋ฌธ์ œ๋‹ค.
์ €์žฅ์†Œ๊ฐ€ ์ƒ์„ฑ๋ ๋•Œ counterReducer ๋ผ๋Š” ๋ฆฌ๋“€์„œ ํ•จ์ˆ˜๊ฐ€ ์•ˆ์— ์žˆ๋Š” ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š”๋ฐ, ๋ฌธ์ œ๋Š” ๊ทธ ์‹œ์ ์— ์ƒํƒœ๊ฐ€ ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š๋Š”๋‹ค!
์ฒ˜์Œ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์กด ์ƒํƒœ๊ฐ€ ์—†๋Š”๊ฒƒ์ด๋‹ค.
๊ทธ๋ž˜์„œ ๋ฆฌ๋“€์„œ ํ•จ์ˆ˜๊ฐ€ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›๋Š” state ์— ๊ธฐ๋ณธ๊ฐ’์„ ์ฃผ์–ด์•ผ ํ•œ๋‹ค!! (๋‹ฌ๋ฆฌ ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ๊ฐ’์ด ๊ฐ€์ •๋œ๋‹ค. )
์ตœ์ดˆ ์‹คํ–‰๋  ๋•Œ, ๊ฐ’์ด ์žˆ๊ฒŒ ํ•˜๋Š”๊ฑฐ๊ณ , ๊ทธ ๋‹ค์Œ๋ถ€ํ„ฐ๋Š” ๊ธฐ์กด ์ƒํƒœ๊ฐ€ ์žˆ๊ฒŒ ๋œ๋‹ค. (๊ธฐ๋ณธ๊ฐ’์€ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค. )
๊ทธ๋ž˜์„œ ๋ฆฌ๋“€์„œ ํ•จ์ˆ˜์— state={conuter:0}๋ผ๊ณ  state ํŒŒ๋ผ๋ฏธํ„ฐ์— ๊ธฐ๋ณธ๊ฐ’์„ ์ค€๊ฑฐ๋‹ค.

 

์ •๋ฆฌ ๐Ÿ‘‡

๋ฆฌ๋“€์„œ๊ฐ€ ์ฒ˜์Œ ํ˜ธ์ถœ๋  ๋•Œ, state๊ฐ’์€ undefined๊ฐ€ ๋œ๋‹ค.

๋”ฐ๋ผ์„œ state์˜ ์ดˆ๊นƒ๊ฐ’์„ ์ง€์ •ํ•ด์„œ ์•ก์…˜์ด ๋ฐœ์ƒํ•˜๊ธฐ ์ „์— ์ด ์ผ€์ด์Šค์— ๋Œ€ํ•ด ์ฒ˜๋ฆฌํ•ด์ค˜์•ผ ํ•œ๋‹ค. ๋งŒ์•ฝ ์ดˆ๊นƒ๊ฐ’์„ ์„ค์ •ํ•ด์ฃผ์ง€ ์•Š์„ ์‹œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. 

 


๋ฆฌ๋“€์„œ์™€ ์ €์žฅ์†Œ ์—ฐ๊ฒฐํ•ด์ฃผ๊ธฐ

const store = redux.createStore(counterReducer);

 

์ €์žฅ์†Œ์™€ ์ž‘์—…ํ•˜๋Š” ๊ฑด ๋ฆฌ๋“€์„œ ํ•จ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— ์ €์žฅ์†Œ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ๋ฆฌ๋“€์„œ ํ•จ์ˆ˜๊ฐ€ ์–ด๋–ค ํ•จ์ˆ˜์ธ์ง€ ์•Œ์•„์•ผ ํ•œ๋‹ค.

 

 

TIP ์ดˆ๊ธฐ์ƒํƒœ๊ฐ€ ๊ถ๊ธˆํ• ๋•Œ

console.log(store.getState());

 

 


์•ก์…˜ ๋งŒ๋“ค์–ด์ฃผ๊ธฐ (์ €์žฅ์†Œ๋ฅผ ๊ตฌ๋…ํ•  ๋ˆ„๊ตฐ๊ฐ€์™€ ๋ฐœ์†กํ•  ์ˆ˜ ์žˆ๋Š” ์•ก์…˜์ด ํ•„์š”ํ•˜๋‹ค!)

const counterSubscriber = () => {
  const latestState = store.getState();
  console.log(latestState);
};

์–ด๋– ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ๋„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค.

ํ•จ์ˆ˜ ์•ˆ์—์„œ ์šฐ๋ฆฌ๋Š” ์ €์žฅ์†Œ์— ๊ฐ€์„œ getState()๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.
getState()๋Š” createStore()๋กœ ์ƒ์„ฑ๋œ ์ €์žฅ์†Œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์—…๋ฐ์ดํŠธ๋œ ํ›„์— ์ตœ์‹  ์ƒํƒœ ์Šค๋ƒ…์ƒท์„ ์ œ๊ณตํ•œ๋‹ค.
๊ทธ๋Ÿผ ์ด ๊ตฌ๋… ํ•จ์ˆ˜๋Š” ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ํŠธ๋ฆฌ๊ฑฐ๋œ๋‹ค. ํŠธ๋ฆฌ๊ฑฐ๊ฐ€ ๋˜๋ฉด getState()๋ฉ”์†Œ๋“œ๋กœ ๋ณ€๊ฒฝ๋œ ํ›„์˜ ์ตœ์‹  ์ƒํƒœ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

 


๋ฆฌ๋•์Šค๊ฐ€ ๊ตฌ๋… ํ•จ์ˆ˜๋ฅผ ์ธ์‹ํ•˜๋„๋ก ํ•ด์ฃผ๊ธฐ

( ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์ด ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋ผ๊ณ  ๋งํ•ด์ค˜์•ผํ•œ๋‹ค. ์ €์žฅ์†Œ์— ๊ฐ€์„œ subscribe() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋œ๋‹ค. )

 

store.subscribe(counterSubscriber);

subscribe()๋ฉ”์†Œ๋“œ๋Š” ๊ตฌ๋… ํ•จ์ˆ˜๋ฅผ ๋ฐ›๊ณ , ๋ฆฌ๋•์Šค๋Š” ๋ฐ์ดํ„ฐ์™€ ์ €์žฅ์†Œ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ๊ทธ๊ฑธ ์‹คํ–‰ํ•ด์ค„๊ฑฐ๋‹ค.
์—ฌ๊ธฐ์„œ counterSubscriber๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๋Š”๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค!! ๊ทธ๋ƒฅ ๊ฐ€๋ฆฌํ‚ฌ๋ฟ์ด๋‹ค! ๊ทธ ์ด์œ ๋Š” ๋ฆฌ๋“€์„œ์™€ ๊ตฌ๋…ํ•จ์ˆ˜ ๋ชจ๋‘ ๋ฆฌ๋“€์„œ๊ฐ€ ์‹คํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ!

 


์•ก์…˜ ๋ณด๋‚ด์ฃผ๊ธฐ (dispatch)

store.dispatch({ type: "increment" });

dispatch()๋Š” ์•ก์…˜์„ ๋ฐœ์†กํ•˜๋Š” ๋ฉ”์†Œ๋“œ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์•ก์…˜์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด์ด๋‹ค.
์‹๋ณ„์ž ์—ญํ• ์„ ํ•˜๋Š” type ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ง„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด์ด๋‹ค. type๋’ค์—๋Š” ๊ณ ์œ ํ•œ ๋ฌธ์ž์—ด์ด ๋˜์–ด์•ผํ•œ๋‹ค.
๊ทธ๋ž˜์•ผ ์šฐ๋ฆฌ๊ฐ€ ๋ฐœ์†กํ•˜๋Š” ๋ชจ๋“  ๊ณ ์œ ํ•œ ์•ก์…˜๋“ค์ด ๋ฆฌ๋“€์„œ์—์„œ ๋‹ค๋ฅธ ๊ฒƒ๋“ค์„ ์œ ๋ฐœํ•˜๊ฒŒ ๋œ๋‹ค.

 

 

โญ๏ธโญ๏ธ ์œ„์—์„œ ์•ก์…˜์€ increment์ด๋‹ค.
์ผ๋ฐ˜์ ์œผ๋กœ ๋ฆฌ๋•์Šค๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ฆฌ๋“€์„œ ๋‚ด๋ถ€์—์„œ ๋‹ค๋ฅธ ์•ก์…˜์—์„œ๋Š” ๋‹ค๋ฅธ ์ผ์„ ํ•˜๋Š”๊ฒŒ ๋ชฉํ‘œ์ด๋‹ค. ๊ทธ๋ž˜์„œ counterReducer ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ์•ˆ์— ๋‘๋ฒˆ์งธ ๋ณ€์ˆ˜๋กœ action์ด ์žˆ๋Š” ๊ฑฐ๋‹ค.
ํ˜„์žฌ ์ƒํƒœ๋ฅผ ๋ฐ›๊ณ , ๋””์ŠคํŒจ์น˜ ๋œ ์•ก์…˜์„ ๋ฐ›์œผ๋ฉด ๊ทธ ๋ฆฌ๋“€์„œ๊ฐ€ ๋Œ์•„๊ฐ€๊ฒŒ ํ•  ๊ฒƒ์ด๋‹ค.

if ์•ก์…˜ ํƒ€์ž…์ด increment์™€ ๊ฐ™๋‹ค๊ณ  ํ•˜๋ฉด ์นด์šดํ„ฐ์— ์ฆ๊ฐ€๋ฅผ ์‹œํ‚ค๊ณ  ์‹ถ๋‹ค. ๊ทธ๊ฒŒ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ์•ก์…˜์ด๋ฉด ๋ณ€ํ•˜์ง€ ์•Š์€ ์ƒํƒœ๋ฅผ ๋ฆฌํ„ดํ•˜๊ฒ ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์ƒํƒœ์— ์žˆ๋Š” ๋ฐธ๋ฅ˜๋ฅผ ๋ฐ”๊ฟ€ ๊ฒƒ์ด๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ดˆ๊ธฐํ™” ๋•Œ๋ฌธ์— ์นด์šดํ„ฐ๋ฅผ ์ฆ๊ฐ€ํ•˜์ง€ ์•Š์„๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋””ํดํŠธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ• ๊ฒƒ์ด๋‹ค.

const counterReducer = (state = { counter: 0 }, action) => {
  if (action.type === "increment") {
    return {
      counter: state.counter + 1,
    };
  }
  return state;
};

// ์ด๋Ÿฌ๊ณ  ์‹คํ–‰์‹œํ‚ค๋ฉด { counter: 1 } ๋ผ๊ณ  ๋‚˜์˜จ๋‹ค. ์ดˆ๊ธฐํ™” ๋•Œ๋ฌธ์— ๋”์ด์ƒ ์ฆ๊ฐ€ํ•˜์ง€ ์•Š๋Š”๋‹ค.

โžฅ ์œ„ ํ•จ์ˆ˜ ํ•ด์„: if ์•ก์…˜ ํƒ€์ž…์ด increment์™€ ๊ฐ™๋‹ค๊ณ  ํ•˜๋ฉด ์นด์šดํ„ฐ์— ์ฆ๊ฐ€๋ฅผ ์‹œํ‚ค๊ณ  ์‹ถ๋‹ค. ๊ทธ๊ฒŒ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ์•ก์…˜์ด๋ฉด ๋ณ€ํ•˜์ง€ ์•Š์€ ์ƒํƒœ๋ฅผ ๋ฆฌํ„ดํ•˜๊ฒ ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ƒํƒœ์— ์žˆ๋Š” ๋ฐธ๋ฅ˜๋ฅผ ๋ฐ”๊ฟ€ ๊ฒƒ์ด๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ดˆ๊ธฐํ™” ๋•Œ๋ฌธ์— ์นด์šดํ„ฐ๋ฅผ ์ฆ๊ฐ€ํ•˜์ง€ ์•Š์„๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋””ํดํŠธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ• ๊ฒƒ์ด๋‹ค.

 


store.dispatch({ type: "decrement" });

// { counter: 1 } { counter: 0 } ์ด๋ ‡๊ฒŒ ๋‚˜์˜จ๋‹ค.

์ฒซ๋ฒˆ์งธ ์ถœ๋ ฅ์€ ์ฆ๊ฐ€ ์•ก์…˜ ๋‹ค์Œ์— store.subscribe(counterSubscriber);์—์„œ ๋‚˜์˜จ๊ฑฐ๋‹ค. ๊ทธ๋ฆฌ๊ณ ๋‚˜์„œ ์•ก์…˜์„ ๋˜ ๋งŒ๋‚˜์„œ store.subscribe(counterSubscriber);๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ–ˆ๊ณ  ์นด์šดํ„ฐ๊ฐ€ 0์ด ๋œ๊ฑฐ๋‹ค.

๋ฆฌ๋•์Šค๋Š” ๋ฆฌ์•กํŠธ์—๋งŒ ์ œํ•œ๋˜์ง€ ์•Š๋Š”๋‹ค.

 


const redux = require("redux");

const counterReducer = (state = { counter: 0 }, action) => {
  return {
    counter: state.counter + 1,
  };
};

const store = redux.createStore(counterReducer);
console.log(store.getState());                      // ์—ฌ๊ธฐ์„œ ์ฝ˜์†”์ฐฝ์— { counter: 1 } ์ฐํžŒ๋‹ค. ์ดˆ๊ธฐ์ƒํƒœ๊ฐ€ 1

const counterSubscriber = () => {
  const latestState = store.getState();
  console.log(latestState);
};

store.subscribe(counterSubscriber);

store.dispatch({ type: "increment" });             // ์—ฌ๊ธฐ์„œ ์ฝ˜์†”์ฐฝ์— { counter: 2 } ์ฐํžŒ๋‹ค. ์ดˆ๊ธฐ์ƒํƒœ์— +1

 


const redux = require("redux");

const counterReducer = (state = { counter: 0 }, action) => {
  if (action.type === "increment") {
    return {
      counter: state.counter + 1,
    };
  }
  if (action.type === "decrement") {
    return {
      counter: state.counter - 1,
    };
  }
  return state;
};

const store = redux.createStore(counterReducer);
console.log(store.getState());             //์—ฌ๊ธฐ์„œ ์ฝ˜์†”์ฐฝ์— { counter: 0 } ์ฐํžŒ๋‹ค. ์ดˆ๊ธฐํ™” ๋•Œ๋ฌธ์— counter๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค์ง€ ์•Š๋Š”๋‹ค. ๋Œ€์‹  ๋””ํดํŠธ ์ƒํƒœ๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค. 

const counterSubscriber = () => {
  const latestState = store.getState();
  console.log(latestState);
};

store.subscribe(counterSubscriber);

store.dispatch({ type: "increment" }); // ์—ฌ๊ธฐ์„œ ์ฝ˜์†”์ฐฝ์— { counter: 1 } ์ฐํžŒ๋‹ค. ์ดˆ๊ธฐ์ƒํƒœ์— +1
store.dispatch({ type: "decrement" }); // ์—ฌ๊ธฐ์„œ ์ฝ˜์†”์ฐฝ์— { counter: 0 } ์ฐํžŒ๋‹ค. ํ˜„์žฌ์ƒํƒœ์— -1

 

 

 


 

์ฐธ๊ณ )

์œ ๋ฐ๋ฏธ ๋ฆฌ์•กํŠธ ์™„๋ฒฝ๊ฐ€์ด๋“œ

 

 

๐Ÿ˜ƒ ์ž˜๋ชป๋œ ๊ฐœ๋… ์ „๋‹ฌ์ด ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ €์˜ ์„ฑ์žฅ์— ํฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค๐Ÿค“