3. Follow Redux

  • Redux

  • Reflect

๊ฐ•์˜ ์ •๋ฆฌ

Redux ๋”ฐ๋ผํ•˜๊ธฐ

์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์œ„์ฃผ๋กœ ์ง„ํ–‰ํ•œ๋‹ค.

github์˜ external-store folder์— ํ•ด๋‹น ๋‚ด์šฉ์„ ์ •๋ฆฌํ–ˆ๋‹ค.

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

action์€ ๊ธฐ๋ณธ์ ์œผ๋กœ type์„ ๊ฐ€์ง„๋‹ค. type์€ ์„ ์–ธ์ ์œผ๋กœ state๋ฅผ ์–ด๋–ป๊ฒŒ ๋ณ€๊ฒฝ์‹œํ‚ฌ ๊ฒƒ์ธ์ง€๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. state๋ฅผ ๋ณ€๊ฒฝ์‹œํ‚ค๋Š” ๊ฒฝ์šฐ์— action์— ํŠน์ • ๊ฐ’์„ ์ „๋‹ฌํ•ด์ค„ ์ˆ˜ ์žˆ๋Š”๋ฐ ์ผ๋ฐ˜์ ์œผ๋กœ payload๋ผ๋Š” ๋„ค์ด๋ฐ์„ ์‚ฌ์šฉํ•œ๋‹ค. redux์—์„œ payload๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

payload์˜ ํƒ€์ž…์€ ๋จผ์ € ์žก์•„์ค„ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—, Action ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋Š” ์ชฝ์—์„œ ์žก์•„์ค„ ์ˆ˜ ์žˆ๋„๋ก ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ–ˆ๋‹ค.

export type Action<Payload> = {
  type: string;
  payload?: Payload;
};

reducer๋Š” ๊ธฐ์กด์˜ state์™€ action์„ ๋ฐ›๋Š”๋‹ค. reducer๋Š” action์— ๋”ฐ๋ผ์„œ state๋ฅผ ๋ณ€ํ™”์‹œํ‚ค๊ณ , ์ƒˆ๋กœ์šด state๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด๋Š” ๋ถˆ๋ณ€์„ฑ์„ ์ง€์ผœ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ธฐ์กด์˜ state๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด ๋ณ€ํ™”๋ฅผ ์•Œ์•„์ฐจ๋ฆด ์ˆ˜ ์—†๋‹ค. ํ˜„์žฌ ์ž‘์„ฑ๋œ ์ฝ”๋“œ์—์„œ ์›์‹œ ํƒ€์ž…์˜ ๊ฒฝ์šฐ์—๋Š” ๊ผญ ๋ถˆ๋ณ€์„ฑ์„ ์ง€ํ‚ค์ง€ ์•Š์•„๋„ ์ƒํƒœ๊ฐ€ ์—…๋ฐ์ดํŠธ ๋  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๊ณ , ๊ฐ์ฒด ํƒ€์ž…์˜ ๊ฒฝ์šฐ์—๋Š” ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ์ง€๋Š” ์•Š์•˜์ง€๋งŒ ์‹ค์ œ ๊ฐ์ฒด์˜ ๊ฐ’์ด ์•„๋‹Œ ์ฃผ์†Œ ๊ฐ’์œผ๋กœ ๋น„๊ตํ•˜๋Š”๊ฒŒ ์„ฑ๋Šฅ๋ฉด์—์„œ ๊ดœ์ฐฎ์„ ๊ฒƒ ๊ฐ™๋‹ค.

type Reducer<State, Payload> = (state: State, action: Action<Payload>) => State;

dispatch๋กœ action์„ reducer์—๊ฒŒ ๋˜์ง„๋‹ค. ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ , ๊ตฌ๋…ํ•˜๊ณ  ์žˆ๋˜ listener๋“ค์—๊ฒŒ ๋…ธํ‹ฐ๋ฅผ ์ค€๋‹ค.

 dispatch<T>(action: Action<T>) {
  this.state = this.reducer(this.state, action);
  this.listeners.forEach((listener) => listener());
 }

Last updated