frontEnd/React

์ „์—ญ์ƒํƒœ๊ด€๋ฆฌ๋Š” ๋ญ๊ฐ€์ข‹์„๊นŒ?(Redux,Zustand,Mobx)

kim_genius_ 2024. 4. 19. 16:34

๐Ÿ‘‹ ์™œ ์ „์—ญ์ƒํƒœ๊ด€๋ฆฌ๋ฅผ ํ•ด์•ผํ• ๊นŒ?

React์˜ ์‚ฌ์šฉ๋ชฉ์  ์ƒ component๋กœ ๋งŒ๋“ค์–ด ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ณ  page๋ฅผ ๋ผ์šฐํŠธ ์ฒ˜๋ฆฌํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ •๋ง ๋งŽ๋‹ค. ๊ทธ๋Ÿฌ๋‹ค๋ณด๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ€๋ชจ->์ž์‹์—๊ฒŒ ์ „๋‹ฌํ•˜๊ฒŒ ๋œ๋‹ค. ex. ๊ฒŒ์‹œ๊ธ€์˜ id๊ฐ’, ์‡ผํ•‘๋ชฐ ๊ตฌ๋งค ์ˆ˜๋Ÿ‰ ๋“ฑ

๊ทธ๋Ÿฐ๋ฐ ์ƒํƒœ๊ด€๋ฆฌ(= ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌ/๋ณ€๊ฒฝํ•˜๋Š” ๊ณผ์ •) ์‹œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฌธ์ œ์— ๋ถ€๋”ชํžˆ๋Š”๋ฐ ๋ช‡ ๊ฐ€์ง€๋ฅผ ์†Œ๊ฐœํ•˜์ž๋ฉด

์ƒํƒœ๊ด€๋ฆฌ ์‹œ ๋ฌธ์ œ์ 
1.๋ถ€๋ชจ-> ์ž์‹์—๊ฒŒ๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.(์ผ๋ฐ˜์ ์œผ๋กœ)
2.Props drilling์œผ๋กœ ์ธํ•ด ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์ง„๋‹ค. (์•„๋ž˜์˜ Children์ด 100๊ฐœ๋ผ๋ฉด...? ํ•œ๊ฐœ์˜ ์ƒํƒœ๋ฅผ 100๋ฒˆ ๊ฑด๋„ค์ค˜์•ผํ•จ)
3.์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์ฒด์ธ๋œ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žฌ๋žœ๋”๋ง๋œ๋‹ค.(Children3์˜ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด Ch2,Ch1,Parent ๋„ ์žฌ๋žœ๋”๋ง ๋จ)
//Parent.jsx(Props๋กœ ์ƒํƒœ์ „๋‹ฌ)

const Parents = () => {
    const [state,setstate] = useState('ํšจ๋„ ์ข€ ํ•˜๊ณ  ์‚ด์ž')
  return  <Children1 data={state}></Children1>
}

//Children1.jsx
const Children1 = (props) => {
  return <Children2 data={props.data}></Children2>
}

//Children2.jsx
const Children2 = (props) => {
  return <Children3 data={props.data}></Children3>
}

//Childrens3.jsx
const Children3 = (props) => {
  return <div>{props.data}</div>
}

 

์œ„์™€ ๊ฐ™์€ ๋ฌธ์ œ์ ๋“ค์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ „์—ญ์ ์œผ๋กœ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ƒ๊ฒจ๋‚ฌ๋‹ค.


๐ŸŒˆ ์ „์—ญ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋ญ๊ฐ€ ์žˆ์„๊นŒ?

์•„๋ž˜๋Š” npm trends์—์„œ ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋น„๊ตํ•œ ์ง€ํ‘œ์ด๋‹ค. ํ•œ ํ•ด ๋™์•ˆ ๋‹ค์šด๋กœ๋“œ๋Ÿ‰์„ ๋น„๊ตํ•ด์ค€๋‹ค.

 

1๋“ฑ Redux (9,200,000)

2๋“ฑ Zustnad (3,100,000)

3๋“ฑ Mobx(1,200,000)

4๋“ฑ jotai 5๋“ฑ recoil

 

๐ŸŒˆ ์ƒํƒœ๊ด€๋ฆฌ์˜ ์ ‘๊ทผ๋ฐฉ์‹

์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ ‘๊ทผ ๋ฐฉ์‹์„ 3๊ฐ€์ง€๋กœ ๋‚˜๋ˆ ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ : 

 

Flux (Redux, Zustand)

  • Flux ํŒจํ„ด์€ ์ƒํƒœ ๊ด€๋ฆฌ์˜ ์ „ํ†ต์ ์ธ ๋ฐฉ์‹์œผ๋กœ, ์•ก์…˜(Action), ๋””์ŠคํŒจ์ฒ˜(Dispatcher), ์Šคํ† ์–ด(Store), ๊ทธ๋ฆฌ๊ณ  ๋ทฐ(View)๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.
  • Redux์™€ Zustand๋Š” Flux ํŒจํ„ด์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ๋ฐ Redux๋Š” ๋ถˆ๋ณ€์„ฑ๊ณผ ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ๊ฐ•์กฐํ•˜๋ฉฐ, Zustand๋Š” ๊ฐ„์†Œํ•œ API์™€ ํ•จ์ˆ˜ํ˜• ์Šคํƒ€์ผ์„ ๊ฐ•์กฐํ•œ๋‹ค.

์žฅ์ :

  • ์•ก์…˜๊ณผ ๋ฆฌ๋“€์„œ๋ฅผ ํ†ตํ•œ ๋ช…์‹œ์ ์ธ ์ƒํƒœ ๋ณ€๊ฒฝ์œผ๋กœ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ์ถ”์ ํ•˜๊ณ  ๋””๋ฒ„๊น…ํ•˜๊ธฐ ์‰ฝ๋‹ค.
  • ์ค‘์•™ ์ง‘์ค‘์‹ ์ƒํƒœ ๊ด€๋ฆฌ๋กœ ์ƒํƒœ์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ณ  ๋ฒ„๊ทธ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Œ.

๋‹จ์ :

  • ๋ณต์žกํ•œ ์ƒํƒœ ๊ด€๋ฆฌ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ๋‚˜ ์ค‘๋ณต์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ดˆ๊ธฐ ํ•™์Šต ๊ณก์„ ์ด ๋‹ค์†Œ ๋†’์„ ์ˆ˜ ์žˆ์Œ.

 

Proxy (Mobx, Valtio)

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

์žฅ์ :

  • ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•˜๊ณ  ๋ฐ˜์‘ํ•˜๋Š” ๋™์ ์ธ ๋ฐฉ์‹์œผ๋กœ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ƒํƒœ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ณผ์ •์ด ๊ฐ„๋‹จํ•˜๊ณ  ์ง๊ด€์ .

๋‹จ์ :

  • ๊ฐ์ฒด์˜ ์†์„ฑ ๋ณ€๊ฒฝ๋งŒ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ์œ ํ˜•์˜ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Œ.
  • ๋ณต์žกํ•œ ์ƒํƒœ์˜ ๊ด€๋ฆฌ๋Š” ์ผ๋ถ€ ๋ณต์žก์„ฑ์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค.

 

Atomic (Jotai, Recoil)

  • Atomic ์ƒํƒœ ๊ด€๋ฆฌ๋Š” ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ ์•ˆ์—์„œ ์ƒํƒœ๋ฅผ ์›์ž์ * ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.
  • Jotai๋Š” ๋ฆฌ์•กํŠธ์˜ useContext ํ›…๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜๋ฉฐ, ์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ ์ƒํƒœ ๊ณต์œ ๋ฅผ ์œ„ํ•œ ๊ฐ„๋‹จํ•˜๊ณ  ์ง๊ด€์ ์ธ API๋ฅผ ์ œ๊ณตํ•จ.
  • Recoil์€ ํŽ˜์ด์Šค๋ถ์—์„œ ๊ฐœ๋ฐœํ•œ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, ์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ ์ „์—ญ ์ƒํƒœ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•จ.

์žฅ์ :

  • ์ปดํฌ๋„ŒํŠธ ๊ฐ„์— ๋…๋ฆฝ์ ์ธ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ํ†ตํ•ด ์ƒํƒœ์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Œ.
  • ์ƒํƒœ๋ฅผ ๋” ์„ธ๋ฐ€ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•˜๊ณ , ์ƒํƒœ์˜ ๋ณ€๊ฒฝ์ด ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋กœ ์ œํ•œ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋  ์ˆ˜ ์žˆ์Œ.

๋‹จ์ :

  • ์ „์—ญ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ์—๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.
  • ์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ ์ƒํƒœ ๊ณต์œ ๊ฐ€ ๋ณต์žกํ•œ ๊ฒฝ์šฐ์—๋Š” ์ถ”๊ฐ€์ ์ธ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ๋‹ค.
์›์ž์ ์ด๋ž€?

์ƒํƒœ๊ฐ€ ๊ฐ๊ฐ์˜ ์ž‘์€ ๋‹จ์œ„๋กœ ๋‚˜๋‰˜์–ด ๊ด€๋ฆฌ๋˜๊ณ , ์ด๋Ÿฌํ•œ ์ž‘์€ ๋‹จ์œ„์˜ ์ƒํƒœ๊ฐ€ ๋™์‹œ์— ์—…๋ฐ์ดํŠธ๋˜์–ด์•ผ ํ•  ๋•Œ ์ „์ฒด์ ์œผ๋กœ ์ผ์–ด๋‚˜์•ผ ํ•˜๋Š” ์ƒํƒœ์˜ ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ๊ฒƒ

 

๊ทธ๋ ‡๋‹ค๋ฉด ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ์„ธ๊ฐ€์ง€์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜์ง€ ์•Œ์•„๋ณด์ž.


๐ŸŒผ Redux : ๊ตฌ๊ด€์ด ๋ช…๊ด€

ใ…‡ ๊ธฐ๋ณธ์šฉ์–ด์ •๋ฆฌ

-์•ก์…˜(Action)

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์Šคํ† ์–ด๋กœ ๋ณด๋‚ด๋Š” ๋ฐ์ดํ„ฐ ๋ฌถ์Œ.

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

๋ฆฌ๋“€์„œ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ํ•จ์ˆ˜. ์ด์ „ ์ƒํƒœ์™€ ์•ก์…˜์„ ๋ฐ›์•„ ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ๋ฐ˜ํ™˜ํ•จ.

-์Šคํ† ์–ด(Store)

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ๊ฐ์ฒด. ์Šคํ† ์–ด๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ๋ฅผ ๊ฐ์‹œํ•˜๊ณ , ๋ฆฌ๋“€์„œ๋ฅผ ํ†ตํ•ด ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋ฉฐ, ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•œ ํ›„์— ์•Œ๋ฆผ.

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

์•ก์…˜์„ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ์—ญํ• ์„ ํ•จ. ๋””์ŠคํŒจ์น˜๋Š” ์•ก์…˜์„ ๋ฐ›์•„ ์Šคํ† ์–ด์— ์ „๋‹ฌํ•˜๊ณ , ์ดํ›„ ๋ฆฌ๋“€์„œ๊ฐ€ ํ˜ธ์ถœ๋˜์–ด ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•จ.

์žฅ์ :

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

๋‹จ์ :

  • ๋Ÿฌ๋‹์ปค๋ธŒ: ์ฒ˜์Œ์— ํ•™์Šตํ•˜๊ธฐ ์–ด๋ ต๋‹ค ๋ณต์žกํ•˜๊ธฐ ๋•Œ๋ฌธ. ์•ก์…˜, ๋ฆฌ๋“€์„œ, ๋ฏธ๋“ค์›จ์–ด ๋“ฑ์˜ ๊ฐœ๋…์„ ์ดํ•ดํ•ด์•ผ ํ•˜๋ฉฐ, ์ดˆ๊ธฐ ์„ค์ • ๋ฐ ๊ตฌ์„ฑ์ด ํ•„์š”ํ•จ.
  • ๋ถˆํ•„์š”ํ•œ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ* ์ฝ”๋“œ: Redux๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋งŽ์€ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๋Š” ์ž‘์€ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ณต์žกํ•ด์ง.
๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ๋ž€?

์ƒˆ๋กœ์šด ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ ํ•„์š”ํ•œ ๊ธฐ๋ณธ์ ์ธ ์ฝ”๋“œ๋‚˜ ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ดˆ๊ธฐ ์„ค์ •์ด๋‚˜ ํ…œํ”Œ๋ฆฟ์„ ์˜๋ฏธ(React์˜ CRA ๊ฐ™์€ ๊ฒƒ)

import { createStore } from 'redux';

// ์ดˆ๊ธฐ ์ƒํƒœ ์ •์˜
const initialState = {
  count: 0
};

// ๋ฆฌ๋“€์„œ ์ •์˜
function reducer(state = initialState, action) {
  switch (action.type) {
    case 'INCREMENT':
      return { ...state, count: state.count + 1 };
    default:
      return state;
  }
}

// ์Šคํ† ์–ด ์ƒ์„ฑ
const store = createStore(reducer);

// ์ปดํฌ๋„ŒํŠธ์—์„œ ์ƒํƒœ ๋ณ€๊ฒฝ์„ ์œ„ํ•œ ์•ก์…˜ ๋””์ŠคํŒจ์น˜
store.dispatch({ type: 'INCREMENT' });

 

 

 


๐ŸŒผ Zustand : simple is best

import { create } from 'zustand'

const useCountStore = create((set) => ({
  count: 0,
  increment: (qty) => set((state) => ({ count: state.count + qty })),
  decrement: (qty) => set((state) => ({ count: state.count - qty })),
}))

const Component = () => {
  const count = useCountStore((state) => state.count)
  const increment = useCountStore((state) => state.increment)
  const decrement = useCountStore((state) => state.decrement)
  // ...
}

์žฅ์ :

  • ๊ฐ„๊ฒฐํ•จ: Zustand๋Š” Redux๋ณด๋‹ค ํ›จ์”ฌ ๊ฐ„๋‹จํ•˜๊ณ  ์ง๊ด€์ ์ด๋‹ค. ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ๋ณ„๋„์˜ ๋ฆฌ๋“€์„œ๋‚˜ ์•ก์…˜ ์ƒ์„ฑ์ž๋ฅผ ์ž‘์„ฑํ•  ํ•„์š”๊ฐ€ ์—†์Œ.
  • ์„ ํƒ์  ๋ถˆ๋ณ€์„ฑ: Zustand๋Š” ๋ถˆ๋ณ€์„ฑ์„ ๊ฐ•์ œํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด๋Š” ์ž‘์€ ๊ทœ๋ชจ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ ๋” ํŽธ๋ฆฌํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ.
  • ์„ฑ๋Šฅ: Zustand๋Š” ๋‹จ์ˆœํ•œ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ๋กœ์„œ Redux๋ณด๋‹ค ๊ฐ€๋ณ๊ณ  ๋น ๋ฅด๋‹ค. ์ด๋Š” ์ž‘์€ ๊ทœ๋ชจ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ถˆํ•„์š”ํ•œ ๋ณต์žก์„ฑ์„ ์ค„์—ฌ์คŒ.

๋‹จ์ :

  • ์ƒํƒœ ๊ณต์œ ์˜ ์–ด๋ ค์›€: Zustand๋Š” ๊ฐ ์ปดํฌ๋„ŒํŠธ์˜ ์ง€์—ญ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ์— ์ ํ•ฉํ•จ. ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ ๊ฐ„์— ์ƒํƒœ๋ฅผ ๊ณต์œ ํ•˜๊ณ  ๋™๊ธฐํ™”ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ถ”๊ฐ€์ ์ธ ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค.
  • ์ปค๋ฎค๋‹ˆํ‹ฐ์™€ ์ƒํƒœ๊ณ„์˜ ํฌ๊ธฐ: Zustand๋Š” Redux๋งŒํผ ํฐ ์‚ฌ์šฉ์ž ์ปค๋ฎค๋‹ˆํ‹ฐ๋‚˜ ๋‹ค์–‘ํ•œ ์ƒํƒœ๊ณ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์Œ. 
  • ์œ ์—ฐ์„ฑ์˜ ๋ถ€์กฑ: Zustand๋Š” React์— ํŠนํ™”๋˜์–ด ์žˆ์œผ๋ฉฐ, ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€์˜ ํ˜ธํ™˜์— ์ถ”๊ฐ€ ์„ค์ •์ด ํ•„์š”ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ๋งŒ์•ฝ ํ–ฅํ›„ ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์ด ์˜ˆ์ƒ๋œ๋‹ค๋ฉด ์ด๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•จ.

 

 

 


๐ŸŒผ Mobx : Always, i will see you

import { observable, action, computed } from 'mobx';

// observable ์ƒํƒœ ์ •์˜
const counterState = observable({
  count: 0,
});

// action์œผ๋กœ ์ƒํƒœ ๋ณ€๊ฒฝ ๋ฉ”์„œ๋“œ ์ •์˜
const increment = action(() => {
  counterState.count++;
});

// computed๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ƒ๋œ ๊ฐ’ ๊ณ„์‚ฐ
const doubleCount = computed(() => {
  return counterState.count * 2;
});

// ์ƒํƒœ ๋ณ€๊ฒฝ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ
increment();

// ํŒŒ์ƒ๋œ ๊ฐ’ ์กฐํšŒ
console.log(doubleCount.get()); // ์ถœ๋ ฅ: 2

 

์žฅ์ :

  • ๊ฐ„๋‹จํ•จ: MobX๋Š” ๊ฐ„๋‹จํ•˜๊ณ  ์ง๊ด€์ ์ธ API๋ฅผ  ์ œ๊ณตํ•œ๋‹ค. ์ž๋™์œผ๋กœ ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ ๊ด€๋ฆฌํ•จ.
  • ๋ฐ˜์‘์„ฑ: MobX๋Š” ๊ด€์ฐฐ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ์™€ ์˜์กด์„ฑ ๊ทธ๋ž˜ํ”„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํƒœ ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•˜๊ณ  ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธํ•จ.
  • ์œ ์—ฐ์„ฑ: MobX๋Š” Redux์™€ ๋‹ฌ๋ฆฌ ์•ก์…˜, ๋ฆฌ๋“€์„œ, ๋””์ŠคํŒจ์ฒ˜ ๋“ฑ์˜ ๊ฐœ๋…์ด ํ•„์š”ํ•˜์ง€ ์•Š์•„์„œ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ๋” ๊ฐ„ํŽธํ•˜๋‹ค.

๋‹จ์ :

  • ๋Ÿฌ๋‹ ์ปค๋ธŒ: MobX์˜ ๊ฐœ๋…๊ณผ ๋™์ž‘ ๋ฐฉ์‹์„ ์ฒ˜์Œ์— ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Œ. ํŠนํžˆ MobX์˜ ๊ด€์ฐฐ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ์™€ ์˜์กด์„ฑ ๊ทธ๋ž˜ํ”„์˜ ๋™์ž‘ ์›๋ฆฌ ์ดํ•ด๊ฐ€ ํ•„์š”ํ•จ.
  • ์ž์œ ๋„๋กœ ์ธํ•œ ํ˜ผ๋ž€: MobX๋Š” Redux๋ณด๋‹ค ์ž์œ ๋กœ์šด ๋ฐฉ์‹์œผ๋กœ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค. ์ด๋Š” ํ”„๋กœ์ ํŠธ์—์„œ ์ผ๊ด€๋œ ํŒจํ„ด์„ ์œ ์ง€ํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Œ.
  • ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ํฌ๊ธฐ: MobX์˜ ์‚ฌ์šฉ์ž ์ปค๋ฎค๋‹ˆํ‹ฐ๋Š” Redux๋งŒํผ ํฌ์ง€ ์•Š์Œ.

 

๐Ÿ”” ๋งˆ์น˜๋ฉฐ...

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


์ฐธ๊ณ 

https://docs.pmnd.rs/zustand/getting-started/introduction

 

Zustand Documentation

Zustand is a small, fast and scalable bearbones state-management solution, it has a comfy api based on hooks

docs.pmnd.rs

https://ko.redux.js.org/

 

Redux - ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์•ฑ์„ ์œ„ํ•œ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์ƒํƒœ ์ปจํ…Œ์ด๋„ˆ. | Redux

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์•ฑ์„ ์œ„ํ•œ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์ƒํƒœ ์ปจํ…Œ์ด๋„ˆ.

ko.redux.js.org

https://mobx.js.org/react-integration.html

 

React integration · MobX ๐Ÿ‡บ๐Ÿ‡ฆ

<script async type="text/javascript" src="//cdn.carbonads.com/carbon.js?serve=CEBD4KQ7&placement=mobxjsorg" id="_carbonads_js"></script>

mobx.js.org