ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๋‹ค ๋ณด๋ฉด, ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ์ƒํƒœ๋ฅผ ๊ณต์œ ํ•˜๊ณ  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ๋ฐ˜์˜ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•œ ๊ณผ์ œ๊ฐ€ ๋œ๋‹ค.



์ด๋ฅผ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์กด์žฌํ•˜๋ฉฐ, ๋Œ€ํ‘œ์ ์œผ๋กœ Redux, Recoil, MobX ๋“ฑ์ด ์žˆ๋‹ค. ์ตœ๊ทผ์—๋Š” ๋ณด๋‹ค ๋‹จ์ˆœํ•˜๊ณ  ๊ฐ€๋ฒผ์šด ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ œ๊ณตํ•˜๋Š” Zustand๊ฐ€ ์ฃผ๋ชฉ๋ฐ›๊ณ  ์žˆ๋‹ค.


 

1. Zustand๋ž€ ๋ฌด์—‡์ธ๊ฐ€


https://zustand-demo.pmnd.rs/

 

Zustand

 

zustand-demo.pmnd.rs

 

 

 


Zustand์˜ ๊ณต์‹๋ฌธ์„œ์ด๋‹ค.
๊ณต์‹๋ฌธ์„œ์— ๋”ฐ๋ฅด๋ฉด,

์ž‘๊ณ , ๋น ๋ฅด๋ฉฐ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์ตœ์†Œํ•œ์˜ ์ƒํƒœ ๊ด€๋ฆฌ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค.
Zustand๋Š” ํ›…(Hooks)์— ๊ธฐ๋ฐ˜ํ•œ ํŽธ์•ˆํ•œ API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๊ฐ€ ๋งŽ๊ฑฐ๋‚˜ ํŠน์ •ํ•œ ์˜๊ฒฌ(opinion)์— ์น˜์šฐ์น˜์ง€ ์•Š์ง€๋งŒ, ๋ช…์‹œ์ ์ด๊ณ  Flux์™€ ์œ ์‚ฌํ•œ ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ์ถฉ๋ถ„ํ•œ ๊ทœ์น™์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ท€์—ฝ๋‹ค๊ณ  ๋ฌด์‹œํ•˜์ง€ ๋งˆ์„ธ์š”. ๋ฐœํ†ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค!
๋งŽ์€ ์‹œ๊ฐ„์„ ๋“ค์—ฌ ํ”ํžˆ ๊ฒช๋Š” ๋ฌธ์ œ๋“ค์„ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์•…๋ช… ๋†’์€ ์ข€๋น„ ์ž์‹(zombie child) ๋ฌธ์ œ, React์˜ ๋™์‹œ์„ฑ(concurrency), ์„œ๋กœ ๋‹ค๋ฅธ ๋ Œ๋”๋Ÿฌ ๊ฐ„์˜ ์ปจํ…์ŠคํŠธ ์†์‹ค(context loss) ๋“ฑ์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.
React ์ƒํƒœ๊ณ„์—์„œ ์ด๋Ÿฌํ•œ ๋ชจ๋“  ๋ฌธ์ œ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฑฐ์˜ ์œ ์ผํ•œ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ผ์ง€๋„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค.


๋ผ๊ณ  ํ•œ๋‹ค.

โœ”๏ธ์ข…ํ•ฉํ•ด๋ณด๋ฉด


1. Zustand๋Š” ํ•ต์‹ฌ ๊ธฐ๋Šฅ๋งŒ ์ œ๊ณตํ•˜๋Š” ๊ฐ€๋ฒผ์šด ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

2. Redux์ฒ˜๋Ÿผ ๋ณต์žกํ•œ ์„ค์ •์ด๋‚˜ ํŒŒ์ผ ๊ตฌ์กฐ ์—†์ด๋„ ์“ธ ์ˆ˜ ์žˆ๊ณ , ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ์ปค์ ธ๋„ ๋ฌด๋ฆฌ ์—†์ด ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ 

3. React์˜ useState, useEffect ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ

4. ๋ณต์žกํ•œ action, reducer, dispatch ๊ฐ™์€ ๊ฐœ๋…์„ ๊ฐ•์ œ๋กœ ์“ฐ๊ฒŒ ํ•˜์ง€ ์•Š์•„์„œ ์ง„์ž… ์žฅ๋ฒฝ์ด ๋‚ฎ์Œ

5. ํŠน์ • ํŒจํ„ด์„ ๊ฐ•์ œํ•˜์ง€ ์•Š์ง€๋งŒ, Flux ์•„ํ‚คํ…์ฒ˜์ฒ˜๋Ÿผ ๋ฐ์ดํ„ฐ ํ๋ฆ„์ด ๋‹จ๋ฐฉํ–ฅ์ด๋ผ ๊ตฌ์กฐ๊ฐ€ ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค.

6. ์ข€๋น„ ์ž์‹ ๋ฌธ์ œ(zombie child problem)
→ ์ƒํƒœ๊ฐ€ ์—…๋ฐ์ดํŠธ๋๋Š”๋ฐ ์ด๋ฏธ ์–ธ๋งˆ์šดํŠธ๋œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์˜› ๋ฐ์ดํ„ฐ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋ฒ„๊ทธ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

7. React ๋™์‹œ์„ฑ(Concurrency)
→ React 18์˜ concurrent mode์—์„œ๋„ ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ์•ˆ์ „ํ•˜๊ฒŒ ๋™์ž‘ํ•˜๋„๋ก ์„ค๊ณ„๋จ.

8. ์ปจํ…์ŠคํŠธ ์†์‹ค(Context loss)
→ React Native, Web, Three.js ๊ฐ™์ด ๋ Œ๋”๋Ÿฌ๊ฐ€ ํ˜ผํ•ฉ๋œ ํ™˜๊ฒฝ์—์„œ๋„ ์ƒํƒœ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๊ณต์œ  ๊ฐ€๋Šฅ.


์š”์•ฝ: Zustand๋Š” ๋‹จ์ˆœํ•˜์ง€๋งŒ ๊นŠ์ด ์žˆ๋Š” ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๊ณ , React์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๊นŒ๋‹ค๋กœ์šด ๋ฒ„๊ทธ ์ƒํ™ฉ๋„ ๋Œ€๋ถ€๋ถ„ ํ•ด๊ฒฐํ•ด์ฃผ๋Š” ๊ฑฐ์˜ ์œ ์ผํ•œ ์„ ํƒ์ง€์ด๋‹ค



2. ๊ธฐ๋ณธ์‚ฌ์šฉ๋ฐฉ๋ฒ•

 

import { create } from 'zustand'

const useStore = create((set) => ({
  bears: 0,
  increasePopulation: () => set((state) => ({ bears: state.bears + 1 })),
  removeAllBears: () => set({ bears: 0 }),
  updateBears: (newBears) => set({ bears: newBears }),
}))

 

function BearCounter() {
  const bears = useStore((state) => state.bears)
  return <h1>{bears} bears around here...</h1>
}

function Controls() {
  const increasePopulation = useStore((state) => state.increasePopulation)
  return <button onClick={increasePopulation}>one up</button>
}

 

1. create()
• Zustand ์Šคํ† ์–ด๋ฅผ ๋งŒ๋“œ๋Š” ์ตœ์ดˆ ํ•จ์ˆ˜.
• ์ธ์ž๋กœ ์ „๋‹ฌํ•˜๋Š” ํ•จ์ˆ˜ ์•ˆ์—์„œ ์ƒํƒœ(state)์™€ ์ƒํƒœ ๋ณ€๊ฒฝ ๋กœ์ง(setter)์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.


2. set()
• ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ํ•จ์ˆ˜.
• ๋ถ€๋ถ„ ์—…๋ฐ์ดํŠธ ๊ฐ€๋Šฅ(merge ๋™์ž‘).

3. get()
• ์Šคํ† ์–ด์˜ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ์ฆ‰์‹œ ์ฝ๋Š” ํ•จ์ˆ˜.
• React ํ›… ์—†์ด๋„ ์™ธ๋ถ€์—์„œ ์ƒํƒœ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์Œ.

4. subscribe()
• ํŠน์ • ์ƒํƒœ ๋ณ€ํ™”์— ๋Œ€ํ•ด ๋ฆฌ์Šค๋„ˆ ๋“ฑ๋ก.
• React ์ปดํฌ๋„ŒํŠธ ๋ฐ”๊นฅ์—์„œ๋„ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ ๊ฐ€๋Šฅ.

const unsubscribe = useStore.subscribe(state => {
  console.log('count changed:', state.count);
});

unsubscribe(); // ๊ตฌ๋… ํ•ด์ œ

 

 

 

๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค๊ณผ์˜ ์ฐจ์ด์  (Zustand vs ๋‹ค๋ฅธ ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋น„๊ต)

 

  Zustand Redux Recoil Jotai
์ฒ ํ•™ ์ตœ์†Œํ•œ์˜ API, ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ํŒจํ„ด ์„ค๊ณ„ Flux ์•„ํ‚คํ…์ฒ˜ ๊ธฐ๋ฐ˜, ๊ฐ•๋ ฅํ•œ ๊ทœ์น™๊ณผ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ React ์ƒํƒœ๋ฅผ ์ „์—ญ์ ์œผ๋กœ ๋‹ค๋ฃจ๋Š” Declarative ๋ชจ๋ธ ์›์ž(atom) ๋‹จ์œ„๋กœ ์ƒํƒœ ๊ด€๋ฆฌ, React Hooks ์นœํ™”์ 
๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ๊ฑฐ์˜ ์—†์Œ ๋งŽ์Œ(์•ก์…˜, ๋ฆฌ๋“€์„œ, ์Šคํ† ์–ด ์„ค์ • ๋“ฑ) ์ ์Œ ๊ฑฐ์˜ ์—†์Œ
ํ•™์Šต ๊ณก์„  ๋‚ฎ์Œ ์ค‘๊ฐ„~๋†’์Œ ์ค‘๊ฐ„ ๋‚ฎ์Œ
๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์ž์œ ๋กญ๊ฒŒ ๊ตฌํ˜„(๋ฏธ๋“ค์›จ์–ด ํŒจํ„ด ์•„๋‹˜) ๋ฏธ๋“ค์›จ์–ด(thunk, saga ๋“ฑ) ํ•„์š” Suspense ๊ธฐ๋ฐ˜ ๋น„๋™๊ธฐ ์ง€์› Suspense ๊ธฐ๋ฐ˜ ๋น„๋™๊ธฐ ์ง€์›
๋ฆฌ๋ Œ๋”๋ง ์ œ์–ด selector ๊ธฐ๋ฐ˜์œผ๋กœ ์ปดํฌ๋„ŒํŠธ ๋ฆฌ๋ Œ๋” ์ตœ์†Œํ™” connect ๋˜๋Š” hooks์—์„œ memoization ํ•„์š” ํŒŒํŽธํ™”๋œ atom ๋‹จ์œ„๋กœ ์ตœ์†Œํ™” atom ๋‹จ์œ„๋กœ ์ตœ์†Œํ™”
React ์˜์กด์„ฑ ๋‚ฎ์Œ(React ์—†์ด๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ) ๋†’์Œ ๋†’์Œ ๋†’์Œ
์Šคํ† ์–ด ๊ตฌ์กฐ ๋‹จ์ผ ์Šคํ† ์–ด or ๋‹ค์ค‘ ์Šคํ† ์–ด ๋ชจ๋‘ ๊ฐ€๋Šฅ ์ฃผ๋กœ ๋‹จ์ผ ์Šคํ† ์–ด atom๋“ค์˜ ์ง‘ํ•ฉ atom๋“ค์˜ ์ง‘ํ•ฉ
SSR ์ง€์› ์‰ฌ์›€ ์‰ฌ์›€ ์ผ๋ถ€ ์ผ€์ด์Šค ๊ณ ๋ ค ํ•„์š” ์‰ฌ์›€

 

์šฐ๋ฆฌ ํŒ€์€ ํ˜„์žฌ ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ณผ๋„๊ธฐ๋ฅผ ๊ฒช๊ณ  ์žˆ๋‹ค.
๊ณผ๊ฑฐ ํ”„๋กœ์ ํŠธ ์š”๊ตฌ์‚ฌํ•ญ๊ณผ ํŒ€์›์˜ ์„ ํ˜ธ๋„ ์ฐจ์ด๋กœ ์ธํ•ด Jotai, Redux, Recoil์ด ํ˜ผํ•ฉ๋œ ๊ตฌ์กฐ๊ฐ€ ํ˜•์„ฑ๋˜์—ˆ๊ณ , ๊ทธ ๊ฒฐ๊ณผ ์ „์—ญ ์ƒํƒœ์˜ ํ๋ฆ„์ด ๋ณต์žกํ•ด์ง€๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์ ์  ์–ด๋ ค์›Œ์กŒ๋‹ค.

์ด์— ๋”ฐ๋ผ ์šฐ๋ฆฌ๋Š” ์ƒํƒœ๊ด€๋ฆฌ ๋ฐฉ์‹์„ Zustand๋กœ ํ†ตํ•ฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค.

 


Zustand๋Š” ๋น„๊ต์  ๊ฐ€๋ฒผ์šฐ๋ฉด์„œ๋„ ๋ช…์‹œ์ ์ด๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•˜๋ฏ€๋กœ, ๊ธฐ์กด์— ๋ถ„์‚ฐ๋œ ์ƒํƒœ๋ฅผ ํ•œ ๊ณณ์œผ๋กœ ๋ชจ์œผ๊ธฐ์— ์ ํ•ฉํ•˜๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๋‹ค.

๋‹ค๋งŒ, ํ†ตํ•ฉ ๊ณผ์ •์—์„œ ๊ณ ๋ คํ•ด์•ผ ํ•  ์ค‘์š”ํ•œ ์ ์ด ์žˆ๋‹ค.

 


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

 

 

๋‹ค์Œ ๊ธ€์—์„œ๋Š” ์–ด๋–ป๊ฒŒ ์ด๋Ÿฌํ•œ ๊ณผ์ œ๋“ค์„ ์ ์šฉ์‹œ์ผฐ๋Š”์ง€ ์จ๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค!

 

 

+ Recent posts