[Computer Science] Redux๋ž€?

๊น€๋‘๋ฃจ (FrontEnd Developer)ยท2022๋…„ 4์›” 19์ผ
0

CS(Computer Science)

๋ชฉ๋ก ๋ณด๊ธฐ
15/18

Redux๋ž€?

๐Ÿ‘‰ Redux๋ž€ javascript ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.


์ƒํƒœ ๊ด€๋ฆฌ์˜ ํ•„์š”์„ฑ

๐Ÿ‘‰ ์ƒํƒœ๋ž€?

  • React์—์„œ state๋Š” component ์•ˆ์—์„œ ๊ด€๋ฆฌ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

๐Ÿ‘‰ Component ๊ฐ„์˜ ์ •๋ณด ๊ณต์œ 

  • ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋“ค ๊ฐ„์˜ ๋‹ค์ด๋ ‰ํŠธ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋“ค ๊ฐ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์„ ๋•Œ๋Š” ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ†ตํ•ด์„œ ์ฃผ๊ณ  ๋ฐ›๋Š”๋‹ค.
  • ์ž์‹์ด ๋งŽ์•„์ง„๋‹ค๋ฉด ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ๋งค์šฐ ๋ณต์žกํ•ด์ง„๋‹ค.
  • ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ๊ณ„์† ๋‚ด๋ ค ๋ฐ›์•„์•ผํ•œ๋‹ค. (Props drilling ์ด์Šˆ)

๐Ÿ‘‰ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด

  • ์ „์—ญ ์ƒํƒœ ์ €์žฅ์†Œ ์ œ๊ณต
  • Props drilling ์ด์Šˆ ํ•ด๊ฒฐ

๐Ÿ‘‰ ์ƒํƒœ ๊ด€๋ฆฌ ํˆด ์ข…๋ฅ˜

  • React Context
  • Redux
  • MobX

Redux์˜ ์„ธ๊ฐ€์ง€ ์›์น™

1) Single source of truth
ํ•˜๋‚˜์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์•ˆ์—๋Š” ํ•˜๋‚˜์˜ ์Šคํ† ์–ด๋งŒ ์‚ฌ์šฉํ•˜์ž๋Š” ์›์น™์ด๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋””๋ฒ„๊น…์ด ์‰ฌ์›Œ์ง€๊ณ  ์„œ๋ฒ„์™€์˜ ์ง๋ ฌํ™”๊ฐ€ ๋  ์ˆ˜ ์žˆ๊ณ  ์‰ฝ๊ฒŒ ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„๋“ค์—ฌ์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

2) State is read-only
์ƒํƒœ๋ฅผ ๋ณ€ํ™”์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์€ ์˜ค์ง ์•ก์…˜์„ ์ผ์œผํ‚ค๋Š” ๊ฒƒ์ด๋‹ค. ์ด๊ฒƒ์€ ์ƒํƒœ๋ฅผ ๋ณ€ํ™”์‹œํ‚ค๋Š” ์˜๋„๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๊ณ , ์ƒํƒœ ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ์ถ”์ ์ด ์šฉ์ดํ•ด์ง€๊ฒŒ ๋œ๋‹ค.

3) Changes are made with pure functions
๋ณ€ํ™”๋ฅผ ์ผ์œผํ‚ค๋Š” ๋ฆฌ๋“€์„œ ํ•จ์ˆ˜๋Š” ์ˆœ์ˆ˜ํ•œ ํ•จ์ˆ˜์—ฌ์•ผ ํ•œ๋‹ค. ์ˆœ์ˆ˜ ํ•จ์ˆ˜๋Š” ๋‹ค์Œ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•œ๋‹ค.

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

Redux ๊ธฐ๋ณธ ์šฉ์–ด

1) ์•ก์…˜(Action)
์ƒํƒœ์— ๋ณ€ํ™”๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด ์•ก์…˜์„ ์ผ์œผ์ผœ์•ผํ•œ๋‹ค. ์•ก์…˜์€ ๊ฐ์ฒด๋กœ ํ‘œํ˜„๋˜๋ฉฐ typeํ•„๋“œ๋ฅผ ๋ฐ˜๋“œ์‹œ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.

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

2) ์•ก์…˜ ์ƒ์„ฑํ•จ์ˆ˜(Action Creator)
์•ก์…˜ ์ƒ์„ฑํ•จ์ˆ˜๋Š” ์•ก์…˜ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋Š” ํ•จ์ˆ˜์ด๋‹ค. ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋กœ๋„ ํ‘œํ˜„์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

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

3) ๋ฆฌ๋“€์„œ(Reducer)
๋ฆฌ๋“€์„œ๋Š” ํ˜„์žฌ ์ƒํƒœ์™€ ์•ก์…˜ ๊ฐ์ฒด๋ฅผ ๋ฐ›์•„, ํ•„์š”ํ•˜๋‹ค๋ฉด ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค. ์•ก์…˜ ์œ ํ˜•์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

const initialState = {
 counter: 1,
}
function reducer(state = initialState, action) {
 switch (action.type) {
   case INCREMENT:
     return {
       counter: state.counter + 1,
     }
   default:
     return state
 }
}

4) ์Šคํ† ์–ด(Store)
์Šคํ† ์–ด๋Š” ์ƒํƒœ๊ฐ€ ๋“ค์–ด์žˆ๋‹ค. ํ•˜๋‚˜์˜ ํ”„๋กœ์ ํŠธ๋Š” ํ•˜๋‚˜์˜ ์Šคํ† ์–ด๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

5) ๋””์ŠคํŒจ์น˜(Dispatch)
์Šคํ† ์–ด์˜ ๋‚ด์žฅ ํ•จ์ˆ˜ ์ค‘ ํ•˜๋‚˜์ธ ๋””์ŠคํŒจ์น˜๋Š” ์•ก์…˜ ๊ฐ์ฒด๋ฅผ ๋„˜๊ฒจ์ค˜์„œ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค. ์ด๋ฒคํŠธ ํŠธ๋ฆฌ๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

6) ๊ตฌ๋…(Subscribe)
์Šคํ† ์–ด์˜ ๋‚ด์žฅ ํ•จ์ˆ˜ ์ค‘ ํ•˜๋‚˜์ธ ๊ตฌ๋…์€ ๋ฆฌ์Šค๋„ˆ ํ•จ์ˆ˜๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„ฃ์–ด ํ˜ธ์ถœํ•˜๋ฉด ์ƒํƒœ๊ฐ€ ์—…๋ฐ์ดํŠธ๋  ๋•Œ๋งˆ๋‹ค ํ˜ธ์ถœ๋œ๋‹ค. ์ผ์ข…์˜ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

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

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

7) ์…€๋ ‰ํ„ฐ(Selector)
์ผ๋ฐ˜์ ์ธ vanilla.js์˜ ๋ฆฌ๋•์Šค์—์„œ๋Š” ์Šคํ† ์–ด์˜ ๋‚ด์žฅํ•จ์ˆ˜์ธ getState๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ react-redux์—์„œ๋Š” ์ƒํƒœ ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.


redux ์ƒํƒœ ๋ณ€ํ™”์˜ ํ๋ฆ„

  • ์ดˆ๊ธฐ ์ƒํƒœ
    • ๋จผ์ € root reducer ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งŒ๋“ค์–ด์ง„ ๋ฆฌ๋•์Šค ์Šคํ† ์–ด๊ฐ€ ์žˆ๋‹ค.
    • ์Šคํ† ์–ด๋Š” root reducer๋ฅผ ํ•œ ๋ฒˆ ํ˜ธ์ถœํ•˜๊ณ  ๋ฆฌํ„ด ๊ฐ’์„ ์ดˆ๊ธฐ ์ƒํƒœ๋กœ ์ €์žฅํ•œ๋‹ค.
    • UI๊ฐ€ ์ฒ˜์Œ ๋ Œ๋”๋ง๋  ๋•Œ, UI ์ปดํฌ๋„ŒํŠธ๋Š” ๋ฆฌ๋•์Šค ์Šคํ† ์–ด์˜ ์ƒํƒœ์— ์ ‘๊ทผํ•˜์—ฌ ๊ทธ๊ฒƒ์„ ๋ Œ๋”๋ง์— ํ™œ์šฉํ•œ๋‹ค. ๋˜ํ•œ ๊ทธ๊ฒƒ๋“ค์€ ํ›„์— ์ƒํƒœ์˜ ๋ณ€ํ™”๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜๋Š” ๊ฒƒ์„ ๊ตฌ๋…ํ•œ๋‹ค.
  • ์—…๋ฐ์ดํŠธ(์ˆœ์„œ)
    1) ์œ ์ €๊ฐ€ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•œ๋‹ค.
    2) ์•ฑ์€ ์œ ์ €์˜ ํ–‰๋™์— ๋งž๋Š” ๋””์ŠคํŒจ์น˜๋ฅผ ์‹คํ–‰ํ•ด ์•ก์…˜์„ ์ผ์œผํ‚จ๋‹ค.
    3) ์Šคํ† ์–ด๋Š” ์ด์ „ ์ƒํƒœ์™€ ํ˜„์žฌ ์•ก์…˜์œผ๋กœ ๋ฆฌ๋“€์„œ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๊ณ , ๊ทธ ๋ฆฌํ„ด ๊ฐ’์„ ์ƒˆ๋กœ์šด ์ƒํƒœ๋กœ ์ €์žฅํ•œ๋‹ค.
    4) ์Šคํ† ์–ด๋Š” ์Šคํ† ์–ด๋ฅผ ๊ตฌ๋…ํ•˜๊ณ  ์žˆ๋˜ UI๋“ค์—๊ฒŒ ์—…๋ฐ์ดํŠธ ๋˜์—ˆ๋‹ค๊ณ  ์•Œ๋ ค์ค€๋‹ค.
    5) ์Šคํ† ์–ด์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•œ ๊ฐ๊ฐ์˜ UI๋“ค์€ ํ•„์š”ํ•œ ์ƒํƒœ๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
    6) ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋œ ๊ฐ ๊ตฌ์„ฑ์š”์†Œ๋Š” ์ƒˆ ๋ฐ์ดํ„ฐ๋กœ ๊ฐ•์ œ๋กœ ๋‹ค์‹œ ๋ Œ๋”๋งํ•˜๋ฏ€๋กœ ํ™”๋ฉด์— ํ‘œ์‹œ๋˜๋Š” ๋‚ด์šฉ์„ ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

Redux๋Š” ์–ธ์ œ ์“ฐ๋Š”๊ฒŒ ์ข‹์„๊นŒ?

๐Ÿ‘‰ ๋ฆฌ๋•์Šค ๊ณต์‹๋ฌธ์„œ ์ฐธ๊ณ 

  • ์•ฑ์˜ ์—ฌ๋Ÿฌ ์œ„์น˜์—์„œ ํ•„์š”ํ•œ ๋งŽ์€ ์–‘์˜ ์ƒํƒœ๋“ค์ด ์กด์žฌํ•  ๋•Œ (์ „์—ญ ์ƒํƒœ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ๋Š๊ปด์งˆ ๋•Œ)
  • ์ƒํƒœ๋“ค์ด ์ž์ฃผ ์—…๋ฐ์ดํŠธ ๋  ๋•Œ
  • ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ๋กœ์ง์ด ๋ณต์žกํ•  ๋•Œ
  • ์•ฑ์ด ์ค‘๊ฐ„ ๋˜๋Š” ํฐ ์‚ฌ์ด์ฆˆ์˜ ์ฝ”๋“œ๋ฅผ ๊ฐ–๊ณ  ์žˆ๊ณ  ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์— ์˜ํ•ด ์ฝ”๋“œ๊ฐ€ ๊ด€๋ฆฌ๋  ๋•Œ
  • ์ƒํƒœ๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜๋Š” ์‹œ์ ์„ ๊ด€์ฐฐํ•  ํ•„์š”๊ฐ€ ์žˆ์„ ๋•Œ

Redux์˜ ์žฅ๋‹จ์ 

์žฅ์ 

  • ๋‹จ๋ฐฉํ–ฅ ๋ชจ๋ธ๋ง(ํ•œ๊ฐ€์ง€ ๋ฐฉํ–ฅ์œผ๋กœ๋งŒ ๋ฐ”๋€๋‹ค). action์„ dispatch ํ•  ๋•Œ๋งˆ๋‹ค ๊ธฐ๋ก(history)์ด ๋‚จ์•„ ์—๋Ÿฌ๋ฅผ ์ฐพ๊ธฐ ์‰ฝ๋‹ค. ํƒ€์ž„๋จธ์‹  ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ.
  • ์ƒํƒœ์˜ ์ค‘์•™ํ™” : Store๋ผ๋Š” ์ด๋ฆ„์˜ ์ „์—ญ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ์ƒํƒœ๋ฅผ ํ•œ ๊ณณ์—์„œ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ „์—ญ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ• ๋•Œ ๊ต‰์žฅ์ด ํšจ๊ณผ์ ์ด๋‹ค.
  • Redux๋Š” ์ƒํƒœ๋ฅผ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ์ทจ๊ธ‰ํ•œ๋‹ค. ์ƒํƒœ๊ฐ€ ์ฝ๊ธฐ ์ „์šฉ์ด๋ฏ€๋กœ, ์ด์ „ ์ƒํƒœ๋กœ ๋Œ์•„๊ฐ€๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ทธ์ € ์ด์ „ ์ƒํƒœ๋ฅผ ํ˜„์žฌ ์ƒํƒœ์— ๋ฎ์–ด์“ฐ๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.

๋‹จ์ 

  • ์•„์ฃผ ์ž‘์€ ๊ธฐ๋Šฅ์ด์—ฌ๋„ ๋ฆฌ๋•์Šค๋กœ ๊ตฌํ˜„ํ•˜๋Š” ์ˆœ๊ฐ„ ๋ช‡ ๊ฐœ์˜ ํŒŒ์ผ(์•ก์…˜ ๋“ฑ)๋“ค์„ ํ•„์ˆ˜๋กœ ๋งŒ๋“ค์–ด์•ผํ•˜์—ฌ ์ฝ”๋“œ๋Ÿ‰์ด ๋Š˜์–ด๋‚œ๋‹ค.
  • ํƒ€์ž„๋จธ์‹  ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋ถˆ๋ณ€์„ฑ ๊ฐœ๋…์„ ์ง€์ผœ์•ผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋งค๋ฒˆ state๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์ค˜์•ผ ํ•œ๋‹ค.
  • Redux๋Š” ์ƒํƒœ๋ฅผ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ์ทจ๊ธ‰ํ•  ๋ฟ, ์‹ค์ œ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ๋งŒ๋“ค์–ด์ฃผ์ง€๋Š” ์•Š๋Š”๋‹ค. ๋•Œ๋ฌธ์— ์ƒํƒœ๋ฅผ ์‹ค์ˆ˜๋กœ ์ง์ ‘ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋„๋ก ํ•ญ์ƒ ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

Reference

์ฐธ๊ณ  : ๋ฆฌ๋•์Šค์˜ ์žฅ์ , ๋‹จ์ 

profile
๋ชฐ์ž…ํ•˜๋Š” ๊ฐœ๋ฐœ์ž

0๊ฐœ์˜ ๋Œ“๊ธ€