๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
WEB/REACT

Redux

by mingzoo 2021. 7. 13.

๋ฆฌ๋•์Šค๋Š” ์–ด๋ ต๋‹ค...

Redux?

์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งŽ์„์ˆ˜๋ก ๋ณต์žกํ•ด์ง€๋Š” ์ƒํƒœ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

 

why?

๊ตฌ์กฐ๊ฐ€ ์ ์  ๋ณต์žกํ•ด์ง€๋ฉด์„œ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๋ถ€ํ„ฐ ์ตœํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๊นŒ์ง€ ๋‚ด๋ ค์˜ค๋ฉด์„œ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ๋„ˆ๋ฌด ๋น„ํšจ์œจ์ !

๋ฆฌ๋•์Šค๋กœ ๋ฐ”๊นฅ์—์„œ ์ƒํƒœ๊ด€๋ฆฌ๋ฅผ ํ•ด์ฃผ๋ฉด์„œ ํšจ์œจ์ ์œผ๋กœ ์ ‘๊ทผ!

์ดํ•ด๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ์ƒํ™ฉ์„ ๋ณด์ž!

๐Ÿ‘‡

์œ„์˜ ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ๊ฐ€ ์•„๋ž˜์˜ ์ปดํฌ๋„ŒํŠธ๊ตฌ์กฐ์™€ ๊ฐ™์ด ๋ณต์žกํ•ด์กŒ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

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

์ตœํ•˜์œ„ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๊นŒ์ง€ ์ƒํƒœ๋ฅผ ์ „๋‹ฌ
์ž์‹ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ์— ์˜ํ•ด์„œ ๋‹ค๋ฅธ ๋ฃจํŠธ์— ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๋ณ€ํ™”๋ฅผ ๋ถˆ๋Ÿฌ์ผ์œผ์ผœ์•ผํ•˜๋Š” ์ƒํƒœ์ผ ๊ฒฝ์šฐ

How?

์œ„์— ์ œ๊ฐ€ ๋ฌธ์ œ๋กœ ์ œ์‹œํ–ˆ๋˜ ์ƒํ™ฉ๋“ค์„ ๋ฆฌ๋•์Šค๋Š” ๋ฐ”๊นฅ์—์„œ ์ƒํƒœ๊ด€๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์คŒ

๋ฆฌ๋•์Šค๋Š” ์Šคํ† ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํƒœ๋ฅผ ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ ๋ฐ”๊นฅ์— ๋‘๊ณ  ์Šคํ† ์–ด๋ผ๋Š” ์ค‘๊ฐ„์ž๋ฅผ ํ†ตํ•ด ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ฑฐ๋‚˜, ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ์ „๋‹ฌ๋ฐ›์œผ๋ฉฐ ์ด๋ฃจ์–ด์ง„๋‹ค.

 


About Redux?

๊ทธ๋ ‡๋‹ค๋ฉด ์ด์ œ ๋ฆฌ๋•์Šค๊ฐ€ ๋ฌด์—‡์ด๊ณ  ์™œ ์“ฐ๋Š”์ง€ ๋Œ€๋žต์ ์ธ ์ดํ•ด๊ฐ€ ๋์„๊ฒƒ์ด๋‹ค.

๋‹ค์‹œ ๋ฆฌ๋•์Šค์— ๋Œ€ํ•ด์„œ ์ข€ ๋” ๊นŠ์ด ์ดํ•ดํ•ด๋ณด๋„๋ก ํ•˜์ž!

์›๋ž˜ ํ”„๋ก ํŠธ์—”๋“œ ์ƒํƒœ๊ณ„์—” MVC ํŒจํ„ด์ด ๋Œ€์„ธ์˜€๋‹ค๊ณ ํ•œ๋‹ค.

๋‹ค๋“ค ๊ฐœ๋ฐœ๊ณต๋ถ€๋ฅผ ํ•˜๋ฉด์„œ MVCํŒจํ„ด์— ๋Œ€ํ•ด์„œ ๋งŽ์ด ๋“ค์–ด๋ดค์„๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐ๋œ๋‹ค.

 

MVC ํŒจํ„ด์€ ์œ„์˜ ๊ตฌ์กฐ๋„์ฒ˜๋Ÿผ ๋ฐ์ดํ„ฐ์˜ ์–‘๋ฐฉํ–ฅ์˜ ํ๋ฆ„์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ, ์ด๋Ÿฌํ•œ ํ๋ฆ„์€ ๋ฐ์ดํ„ฐ์— ๋ณ€ํ™”๊ฐ€ ๊ฐ€ํ•ด์กŒ์„ ๋•Œ ๋ณ€ํ™”๊ฐ€ ์–‘์ชฝ์œผ๋กœ ์ผ์–ด๋‚˜๊ธฐ ๋•Œ๋ฌธ์— ์˜คํžˆ๋ ค ๋ณต์žกํ•จ์„ ๋ถˆ๋Ÿฌ์˜จ๋‹ค. 

์ด ์ ์„ ๋ณด์™„ํ•ด์„œ ๋‚˜์˜จ ๊ฒƒ์ด ๋ฐ”๋กœ Flux!

 

Flux๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹จ๋ฐฉํ–ฅ์œผ๋กœ ํ˜๋Ÿฌ๊ฐ€๋Š” ํ๋ฆ„์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์ผ์ • ์žฅ์†Œ์—์„œ๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™”์‹œํ‚ฌ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œํŒŒ์•…์— ๋” ์šฉ์ดํ•˜๋‹ค๋Š” ์žฅ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , ๋ฆฌ์•กํŠธ์—์„œ ์ด๋Ÿฐ ํŒจํ„ด์„ ์ง€ํ–ฅํ•˜๊ณ  ์žˆ๋‹ค.

 

Redux๋Š” Flux๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ „์ฒด์ ์ธ ํŒจํ„ด์€ ๋™์ผํ•˜๋‹ค.

์ƒํƒœ๊ฐ’์€ Store์—์„œ ๊ด€๋ฆฌ๋˜๊ณ , Reducer๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ์ด๋‹ค.

 

Redux๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ 3๊ฐ€์ง€ ๊ทœ์น™

  1. ๋‹จ์ผ ์Šคํ† ์–ด ์‚ฌ์šฉ
    ํ•˜๋‚˜์˜ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์•ˆ์—๋Š” ํ•˜๋‚˜์˜ ์Šคํ† ์–ด๋งŒ ๊ฐ€๋Šฅ!
    ์•ฑ์˜ ๋ชจ๋“  ์ƒํƒœ๋Š” ํ•œ ์žฅ์†Œ(store)์— ์ €์žฅ
  2. ์ƒํƒœ๋Š” ๋ฌด์กฐ๊ฑด ์ฝ๊ธฐ ์ „์šฉ
    ๋ถˆ๋ณ€์„ฑ์œ ์ง€๋ฅผ ์œ„ํ•ด์„œ ์•ก์…˜์„ ํ†ตํ•ด์„œ๋งŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.
  3. ๋ฆฌ๋“€์„œ๋Š” ์ˆœ์ˆ˜ํ•œ ํ•จ์ˆ˜์ด์–ด์•ผํ•จ
    ๋™์ผํ•œ ์ž…๋ ฅ์„ ๋ฐ›์•˜์„ ๋•Œ ์–ธ์ œ๋‚˜ ๋™์ผํ•œ ์ถœ๋ ฅ์„ ๋‚ด๋Š” ํ•จ์ˆ˜ 
    Math.random()์ด๋‚˜ ๋„คํŠธ์›Œํฌ์˜ ์š”์ฒญ์„ ํ•˜๋Š” ์ž‘์—…๊ณผ ๊ฐ™์€ ํ•จ์ˆ˜ ์‚ฌ์šฉX

๋ฆฌ๋•์Šค ๊ฐœ๋…

Action ์•ก์…˜

์ƒํƒœ์— ์–ด๋– ํ•œ ๋ณ€ํ™”๊ฐ€ ํ•„์š”ํ•˜๋ฉด ์•ก์…˜ ๋ฐœ์ƒ!

ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋กœ ํ‘œํ˜„

์•ก์…˜๊ฐ์ฒด๋Š” ๋ฐ˜๋“œ์‹œ typeํ•„๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผํ•œ๋‹ค.

{
  type: "ADD_TODO",
  data: {
    id: 0,
    text: "redux"
  }
}

์•ก์…˜์ƒ์„ฑํ•จ์ˆ˜

์•ก์…˜ ์ƒ์„ฑํ•จ์ˆ˜๋Š” ์•ก์…˜ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ๋Š” ํ•จ์ˆ˜

function addTodo(data) {
  return {
    type: "ADD_TODO",
    data
  };
}

//ํ™”์‚ดํ‘œํ•จ์ˆ˜
const changeInput = text => ({
	type: 'CHANGE_INPUT',
    text
 });

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

 

Reducer ๋ฆฌ๋“€์„œ

๋ฆฌ๋“€์„œ๋Š” ๋ณ€ํ™”๋ฅผ ์ผ์œผํ‚ค๋Š” ํ•จ์ˆ˜

์•ก์…˜ ๋งŒ๋“ค๊ธฐ -> ๋ณ€ํ™” -> ์•ก์…˜ ๋ฐœ์ƒ -> ๋ฆฌ๋“€์„œ๊ฐ€ ํ˜„์žฌ์ƒํƒœ์™€ ์ „๋‹ฌ๋ฐ›์€ ์•ก์…˜๊ฐ์ฒด๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์Œ -> ๋‘๊ฐ’์„ ์ฐธ๊ณ ํ•ด์„œ ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ๋ฐ˜ํ™˜

function reducer(state, action) {
  ...
  return alteredState;
}

 

Store ์Šคํ† ์–ด

ํ”„๋กœ์ ํŠธ์— ๋ฆฌ๋•์Šค๋ฅผ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ์Šคํ† ์–ด๋ฅผ ๋งŒ๋“ ๋‹ค. 

1ํ”„๋กœ์ ํŠธ 1์Šคํ† ์–ด

์Šคํ† ์–ด ์•ˆ์— ํ˜„์žฌ ์•ฑ ์ƒํƒœ์™€ ๋ฆฌ๋“€์„œ๊ฐ€ ๋“ค์–ด์žˆ๊ณ , ๊ทธ๋ฆฌ๊ณ  ๋ช‡๊ฐ€์ง€์˜ ๋‚ด์žฅํ•จ์ˆ˜๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค.

 

Subscribe ๊ตฌ๋…

์Šคํ† ์–ด์˜ ๋‚ด์žฅํ•จ์ˆ˜ ์ค‘ ํ•˜๋‚˜

๊ตฌ๋…ํ•จ์ˆ˜์•ˆ์— ๋ฆฌ์Šคํ„ฐ ํ•จ์ˆ˜๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„ฃ์–ด์„œ ํ˜ธ์ถœ -> ํ•จ์ˆ˜๊ฐ€ ์•ก์…˜์ด ๋””์ŠคํŽ˜์น˜๋ผ์„œ ์—…๋ฐ์ดํŠธ๋ ๋•Œ๋งˆ๋‹ค ํ˜ธ์ถœ๋จ

const listener = () => {
	console.log('์ƒํƒœ๊ฐ€ ์—…๋ฐ์ดํŠธ๋จ');
}
const unsubscribe = store.subscribe(listener);

unsubscribe(); //์ถ”ํ›„ ๊ตฌ๋…์„ ๋น„ํ™œ์„ฑํ™”ํ• ๋•Œ ํ•จ์ˆ˜ ํ˜ธ์ถœ

 

Dispatch ๋””์ŠคํŒจ์น˜

๋””์ŠคํŒจ์น˜๋Š” ์Šคํ† ์–ด์˜ ๋‚ด์žฅ ํ•จ์ˆ˜ ์ค‘ ํ•˜๋‚˜์ด๋‹ค.

์•ก์…˜์„ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ!

๋””์ŠคํŒจ์น˜๊ฐ€ ์•ก์…˜์„ ๋ฐœ์ƒ์‹œ์ผœ ์Šคํ† ์–ด์—๊ฒŒ ์ƒํƒœ๋ณ€ํ™”๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ์•Œ๋ฆผ

๋””์ŠคํŒจ์น˜๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ์Šคํ† ์–ด๋Š” ๋ฆฌ๋“€์„œ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์‹œ์ผœ์„œ ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ๋งŒ๋“ค์–ด ์ค€๋‹ค.

 


์ฐธ๊ณ 

๋ฆฌ์•กํŠธ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ธฐ์ˆ 

https://velog.io/@j35148/Redux-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0

https://velog.io/@youthfulhps/What-is-Redux-and-why-use-it

 

 

 

728x90