๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Redux

๋ฆฌ๋•์Šค๋ž€ ๋ฌด์—‡์ธ๊ฐ€ ?

 ๋‚ด๊ฐ€ ๋ฆฌ๋•์Šค๋ฅผ ๊ณต๋ถ€ํ•˜๋Š” ์ด์œ 

์ฒ˜์Œ ๋ฆฌ์•กํŠธ ๊ณต๋ถ€๋ฅผ ํ•  ๋•Œ ๋ฆฌ์•กํŠธ๋ฅผ ๋ฐฐ์šฐ๊ณ  ๋‚˜์„œ ๋ฆฌ๋•์Šค๋ฅผ ๋ฐฐ์šฐ๋Š” ๊ณผ์ •์ด์—ˆ๋Š”๋ฐ ๋ฆฌ์•กํŠธ๋ฅผ ๋ฐฐ์šฐ๊ณ  ๋ฆฌ์•กํŠธ ๋งŒ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“  ์ดํ›„์— ๋ฆฌ๋•์Šค ๊ณต๋ถ€๋ฅผ ํ•ด์•ผ์ง€ ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์—ˆ๋Š”๋ฐ, ๊ทธ ๋•Œ๋Š” ๋ฆฌ๋•์Šค๊ฐ€ ๋ฌด์—‡์ธ์ง€, ๊ฐœ๋ฐœ์—์„œ ์–ด๋–ค ์—ญํ• ์„ ํ•˜๋Š”์ง€ ์ „ํ˜€ ๋ชจ๋ฅด๋Š” ์ƒํƒœ์˜€๋‹ค.

๋ฆฌ์•กํŠธ ๊ณต๋ถ€๋ฅผ ํ•˜๋‹ค๋ณด๋‹ˆ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์—๊ฒŒ State๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ด ๋ฌด์ฒ™์ด๋‚˜ ๊ท€์ฐฎ์€ ์ผ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์—ˆ๋Š”๋ฐ ์ด๋ฅผ ํ•ด๊ฒฐํ•  ๋งŒํ•œ ๋„๊ตฌ๊ฐ€ ์—†๋‚˜ ์ฐพ์•„๋ดค๋”๋‹ˆ ๋ฆฌ๋•์Šค์˜€๊ณ  ์ด์ œ ๋ฆฌ๋•์Šค๋ฅผ ๋ฐฐ์›Œ๋ณด๋ ค ํ•œ๋‹ค ๐Ÿ˜‰

 

๐Ÿ” ๋ฆฌ๋•์Šค ์†Œ๊ฐœ

๋ฆฌ๋•์Šค๋Š” ๊ฐ€์žฅ ์‚ฌ์šฉ๋ฅ ์ด ๋†’์€ ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.

์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฐ€์ง„ state๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ ์ถฉ๋ถ„ํ•˜์ง€๋งŒ, ํ”„๋กœ์ ํŠธ์˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๋ฉด ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ๊ต‰์žฅํžˆ ๋ฒˆ๊ฑฐ๋กœ์›Œ์งˆ ์ˆ˜ ์žˆ๋‹ค.

๋ฆฌ์•กํŠธ์—์„œ ๋ฆฌ๋•์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ์ƒํƒœ ์—…๋ฐ์ดํŠธ์— ๊ด€ํ•œ ๋กœ์ง์„ ๋ชจ๋“ˆ๋กœ ๋”ฐ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ ํŒŒ์ผ๊ณผ ๋ณ„๊ฐœ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ฝ”๋“œ๋ฅผ ์œ ์ง€ ๋ณด์ˆ˜ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋œ๋‹ค. ๋˜ํ•œ, ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋™์ผํ•œ ์ƒํƒœ๋ฅผ ๊ณต์œ ํ•ด์•ผ ํ•  ๋•Œ ๋งค์šฐ ์œ ์šฉํ•˜๋ฉฐ, ์‹ค์ œ ์—…๋ฐ์ดํŠธ๊ฐ€ ํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ๋งŒ ๋ฆฌ๋ Œ๋”๋ง ๋˜๋„๋ก ์‰ฝ๊ฒŒ ์ตœ์ ํ™”๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค ๊ทธ๋ฆฌ๊ณ  ๋ฆฌ๋•์Šค๋Š” Vanilla JavaScript์˜ ์ƒํƒœ๊ด€๋ฆฌ์—๋„ ๋ฆฌ๋•์Šค๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐ŸŒŠ ๋ฆฌ๋•์Šค์˜ ํ๋ฆ„

๋ฆฌ๋•์Šค๋Š” Action, Action Creator, Reducer, Store, Dispatch๋กœ ์ด๋ฃจ์–ด์ง„ ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค 

 

Action 

์ƒํƒœ์˜ ๋ณ€ํ™”๊ฐ€ ํ•„์š”ํ•  ๋•Œ, ์•ก์…˜์„ ๋ฐœ์ƒ ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ์•ก์…˜์€ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋กœ ํ‘œํ˜„๋œ๋‹ค ์ด ์•ก์…˜ ๊ฐ์ฒด๋Š” type ํ•„๋“œ๋ฅผ ๋ฐ˜๋“œ์‹œ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ด type์˜ ๊ฐ’์„ ์•ก์…˜์˜ ์ด๋ฆ„์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์™ธ์˜ ๊ฐ’๋“ค์€ ๋‚˜์ค‘์— ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•  ๋•Œ ์ฐธ๊ณ ํ•ด์•ผ ํ•  ๊ฐ’์ด๋ฉฐ, ์ž‘์„ฑ์ž ๋งˆ์Œ๋Œ€๋กœ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค.

 

 

 {
    type: 'ADD_TODO',
    data: {
      id: 1,
      text: '๋ฆฌ๋•์Šค ์—ฐ์Šต'
    }
}

 

Action Creator

์•ก์…˜ ์ƒ์„ฑํ•จ์ˆ˜๋ผ ๋ถˆ๋ฆฌ๋Š” Action Creator๋Š” ์•ก์…˜์„ ๋งŒ๋“œ๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ž…๋ ฅ๋ฐ›์•„,

์•ก์…˜ ๊ฐ์ฒด ํ˜•ํƒœ๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค. 

 

 

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

 

 

 

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

 

Reducer

๋ฆฌ๋“€์„œ๋Š” ๋ณ€ํ™”๋ฅผ ์ผ์œผํ‚ค๋Š” ํ•จ์ˆ˜์ด๋‹ค. ์•ก์…˜์„ ๋งŒ๋“ค์–ด์„œ ๋ฐœ์ƒ๊ธฐํ‚ค๋ฉด ๋ฆฌ๋“€์„œ๊ฐ€ ํ˜„์žฌ ์ƒํƒœ์™€ ์ „๋‹ฌ๋ฐ›์€ ์•ก์…˜ ๊ฐ์ฒด๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์•„ ์˜จ๋‹ค.  

 

 

const initialState = {
  counter: 1
};

function reducer (state = initialState, action) {
  switch (action.type) {
    case  ...
    ......
  }
}

 

 

๋‘ ๊ฐ’์„ ์ฐธ๊ณ ํ•˜์—ฌ ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ๋งŒ๋“ค์–ด ๋ฐ˜ํ™˜ํ•ด ์ค€๋‹ค .

 

 

Store

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

 

Dispatch

 

๋””์ŠคํŒจ์น˜๋Š” ์•ก์…˜์„ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ๋””์ŠคํŒจ์น˜๊ฐ€ ์•ก์…˜์„ ๋ฐœ์ƒ์‹œํ‚ค๋ฉด ๋ฆฌ๋“€์„œ์—์„œ ์•ก์…˜์— ๋งž๋Š” ๋กœ์ง์œผ๋กœ ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ๋งŒ๋“ค์–ด ๋ฐ˜ํ™˜ํ•ด ์ค€๋‹ค.

 

๐Ÿ”’ ๋ฆฌ๋•์Šค์˜ ์„ธ ๊ฐ€์ง€ ๊ทœ์น™

 

๋‹จ์ผ ์Šคํ† ์–ด ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•œ๋‹ค

ํ•˜๋‚˜์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์•ˆ์—๋Š” ํ•˜๋‚˜์˜ ์Šคํ† ์–ด๋งŒ ์‚ฌ์šฉํ•˜๋„๋ก ๊ถŒ์žฅํ•œ๋‹ค ์—ฌ๋Ÿฌ๊ฐœ์˜ ์Šคํ† ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅ ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

 

์ƒํƒœ๋Š” ์ฝ๊ธฐ ์ „์šฉ

๋ฆฌ๋•์Šค์˜ ์ƒํƒœ๋Š” ์ฝ๊ธฐ ์ „์šฉ์ด์—ฌ์•ผ ํ•œ๋‹ค. ๋ฆฌ์•กํŠธ์—์„œ state๋ฅผ ์—…๋ฐ์ดํŠธํ•  ๋•Œ ๋ถˆ๋ณ€์„ฑ์„ ์ง€ํ‚ค๊ธฐ ์œ„ํ•ด spread ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋“ฏ ๋ฆฌ๋•์Šค์—์„œ๋„ ๊ธฐ์กด์˜ ๊ฐ์ฒด๋ฅผ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ  ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค.

 

๋ฆฌ๋•์Šค์—์„œ ๋ถˆ๋ณ€์„ฑ์„ ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋Š” ๋‚ด๋ถ€์กฑ์œผ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์„ ๊ฐ์ง€ํ•˜๊ธฐ ์œ„ํ•ด shallow equality ๋ฅผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 

 

๋ฆฌ๋“€์„œ๋Š” ์ˆœ์ˆ˜ํ•œ ํ•จ์ˆ˜

๋ฆฌ๋“€์„œ๋Š” ์ˆœ์ˆ˜ํ•œ ํ•จ์ˆ˜์ด์–ด์•ผ ํ•˜๋ฏ€๋กœ ๋‹ค์Œ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•œ๋‹ค .

  - ๋ฆฌ๋“€์„œ ํ•จ์ˆ˜๋Š” ์ด์ „ ์ƒํƒœ์™€ ์•ก์…˜ ๊ฐ์ฒด๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›๋Š”๋‹ค.

  - ํŒŒ๋ผ๋ฏธํ„ฐ ์™ธ์˜ ๊ฐ’์—๋Š” ์˜์กดํ•˜๋ฉด ์•ˆ ๋œ๋‹ค.

  - ์ด์ „ ์ƒํƒœ๋Š” ์ ˆ๋Œ€๋กœ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ , ๋ณ€ํ™”๋ฅผ ์ค€ ์ƒˆ๋กœ์šด ์ƒํƒœ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  - ๋˜‘๊ฐ™์€ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ํ˜ธ์ถœ๋œ ๋ฆฌ๋“€์„œ ํ•จ์ˆ˜๋Š” ์–ธ์ œ๋‚˜ ๋˜‘๊ฐ™์€ ๊ฒฐ๊ณผ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.

 

๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ํ•˜๋Š” ์ž‘์—…์€ ์ˆœ์ˆ˜ํ•˜์ง€ ๋ชปํ•œ ์ž‘์—…์ด๋ฏ€๋กœ ๋„คํŠธ์›Œํฌ ์š”์ฒญ๊ณผ ๊ฐ™์€ ๋น„๋™๊ธฐ ์ž‘์—…์€ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ํ†ตํ•ด

๊ด€๋ฆฌํ•œ๋‹ค.

 

๐Ÿ‘Œ ๋งˆ๋ฌด๋ฆฌ 

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

 

๋‹ค์Œ ๊ธ€์—์„œ๋Š” ๋ฆฌ๋•์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ํ™˜๊ฒฝ ์„ค์ •๊ณผ ์‹ค์ œ๋กœ ๋ฆฌ๋•์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•˜์—ฌ ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž !