state_management_tutorial

๐Ÿ‘ถ It's time to study Redux, MobX, RxJS

Stars
0

๐Ÿ‘ฉโ€๐Ÿ’ป State Management Tutorial

์ƒํƒœ ๊ด€๋ฆฌ์˜ ๊ธฐ์ดˆ๋ฅผ ๊ณต๋ถ€ํ•ฉ๋‹ˆ๋‹ค.

Redux ๋˜๋Š” MobX๋ฅผ ํ†ตํ•œ ์ƒํƒœ ๊ด€๋ฆฌ

1. ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ฏธํ•™

์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋ฌด์กฐ๊ฑด ํ•„์š”ํ•œ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทœ๋ชจ๊ฐ€ ํฐ ์•ฑ์—์„œ๋Š” ์žˆ๋Š” ๊ฒƒ์ด ํŽธํ•ฉ๋‹ˆ๋‹ค.

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

์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ชจ๋ฅด๊ณ  ์•ˆใ…… ์“ฐ๋Š” ๊ฒƒ๊ณผ ์•Œ๊ณ  ์•ˆ์“ฐ๋Š” ๊ฒƒ์€ ๋งค์šฐ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š” ์ด์œ 

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

์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

2. Redux ์†Œ๊ฐœ ๋ฐ ๊ฐœ๋…์ •๋ฆฌ

๋ฆฌ๋•์Šค๋ฅผ ์ด์š”ํ•˜์—ฌ ์‰ฌ์šด ๊ธ€๋กœ๋ฒŒ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๊ณ , ์ฒด๊ณ„์ ์ด๊ณ  ํŽธ๋ฆฌํ•œ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์•ก์…˜(Action)

์ƒํƒœ์— ์–ด๋–ค ๋ณ€ํ™”๊ฐ€ ํ•„์š”ํ•˜๊ฒŒ ๋ ๋•Œ, ์•ก์…˜์„ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค. ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋กœ ํ‘œํ˜„๋˜๋ฉฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ์ด๋ฃจ์–ด์ ธ์žˆ๋‹ค.

{
  type: "TOGGLE_VALUE";
}

typeํ•„๋“œ๋ฅผ ํ•„์ˆ˜์ ์œผ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผํ•˜๊ณ , ๊ทธ ์™ธ์˜ ๊ฐ’๋“ค์€ ๊ฐœ๋ฐœ์ž ๋งˆ์Œ๋Œ€๋กœ ๋„ฃ์–ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

{
  type: "ADD_TODO",
  data: {
    id: 0,
    text: "๋ฆฌ๋•์Šค ๋ฐฐ์šฐ๊ธฐ"
  }
}
{
  type: "CHANGE_INPUT",
  text: "์•ˆใ„ด"
}

์•ก์…˜ ์ƒ์„ฑํ•จ์ˆ˜(Action Creator)

์•ก์…˜ ์ƒ์„ฑํ•จ์ˆ˜๋Š” ์•ก์…˜์„ ๋งŒ๋“œ๋Š” ํ•จ์ˆ˜, ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ›์•„์™€์„œ ์•ก์…˜ ๊ฐ์ฒด ํ˜•ํƒœ๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค.

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

// arrow function๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.
const changeInput = text => ({
    type: "CHANGE_INPUT",
    text
})

๋ฆฌ๋“€์„œ(Reducer)

๋ฆฌ๋“€์„œ๋Š” ๋ณ€ํ™”๋ฅผ ์ผ์œผํ‚ค๋Š” ํ•จ์ˆ˜๋กœ ๋‘๊ฐ€์ง€์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ›์•„์˜จ๋‹ค.

function reducer(state, action) {
  // ์ƒํƒœ ์—…๋ฐ์ดํŠธ ๋กœ์ง
  return alteredState;
}

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

์Šคํ† ์–ด(Store)

๋ฆฌ๋•์Šค์—์„œ๋Š” ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‹น ํ•˜๋‚˜์˜ ์Šคํ† ์–ด๋ฅผ ๋งŒ๋“ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์Šคํ† ์–ด ์•ˆ์—๋Š” ํ˜„์žฌ ์•ฑ ์ƒํƒœ์™€ ๋ฆฌ๋“€์„œ๊ฐ€ ๋“ค์–ด๊ฐ€์žˆ๊ณ  ์ถ”๊ฐ€์ ์œผ๋กœ ๋ช‡ ๊ฐ€์ง€ ๋‚ด์žฅํ•จ์ˆ˜๋“ค์ด ์žˆ๋‹ค.

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

๋””์ŠคํŒจ์น˜๋Š” ์Šคํ† ์–ด์˜ ๋‚ด์žฅํ•จ์ˆ˜ ์ค‘ ํ•˜๋‚˜๋กœ ์•ก์…˜์„ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ดํ•ดํ•˜๋ฉด ๋œ๋‹ค. dispatch๋ผ๋Š” ํ•จ์ˆ˜์— dispatch(action)์ด๋Ÿฐ ์‹์œผ๋กœ, ์•ก์…˜์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌํ•œ๋‹ค.

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

๊ตฌ๋…(Subscribe)

์Šคํ† ์–ด์˜ ๋‚ด์žฅํ•จ์ˆ˜ ์ค‘ ํ•˜๋‚˜๋กœ subscribeํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜ํ˜•ํƒœ์˜ ๊ฐ’์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์•„์˜จ๋‹ค. subscribe ํ•จ์ˆ˜์— ํŠน์ • ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•ด์ฃผ๋ฉด ์•ก์…˜์ด ๋””์ŠคํŒจ์น˜ ๋˜์—ˆ์„ ๋•Œ๋งˆ๋‹ค ์ „๋‹ฌํ•ด์ค€ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.

๐Ÿ“š ์ฐธ๊ณ ์ž๋ฃŒ

์ข‹์€ ๊ธ€์„ ์จ์ฃผ์‹  Veloport๋‹˜๊ป˜ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.