Skip to content

Zustand โ€‹

Reference

๐Ÿ“Ž Zustand Docs

Zustand ์†Œ๊ฐœ โ€‹

Zustand๋ž€? โ€‹

  • ๋…์ผ์–ด๋กœ ์ƒํƒœ๋ผ๋Š” ์˜๋ฏธ
  • 2019๋…„, Poimandres ํŒ€์—์„œ ๊ฐœ๋ฐœ
  • React์˜ Hooks์™€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ†ตํ•ฉ๋˜๋Š” ๊ฒฝ๋Ÿ‰ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

๊ธฐ๋ณธ ์‚ฌ์šฉ ์˜ˆ์‹œ โ€‹

jsx
import { create } from 'zustand';

const useStore = create((set) => ({
  count: 0,
  increment: () => set((s) => ({ count: s.count + 1 })),
}));

function Counter() {
  const { count, increment } = useStore();
  return (
    <div>
      <h1>{count}</h1>
      <button onClick={increment}>+1</button>
    </div>
  );
}
  • create ํ•จ์ˆ˜๋กœ ์ƒํƒœ์™€ ์—…๋ฐ์ดํŠธ ํ•จ์ˆ˜๋ฅผ ์ •์˜
  • ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” useStore ํ›…์„ ํ˜ธ์ถœํ•ด ๋ฐ”๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ์ƒํƒœ์™€ ๋กœ์ง์ด ํ•œ ๊ณณ์— ๋ชจ์—ฌ ๊ด€๋ฆฌ๊ฐ€ ๋‹จ์ˆœํ•ด์ง„๋‹ค.

Zustand ์žฅ์  โ€‹

  • ๊ฐ„๊ฒฐํ•จ: ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๊ฐ€ ๊ฑฐ์˜ ์—†์Œ
  • ๋‚ฎ์€ ๋Ÿฌ๋‹์ปค๋ธŒ: ํ›… ๊ธฐ๋ฐ˜ API๋ผ ์‰ฝ๊ฒŒ ํ•™์Šต ๊ฐ€๋Šฅ
  • ์œ ์—ฐํ•œ ๊ตฌ์กฐ: ์ž‘์€ ํ”„๋กœ์ ํŠธ๋ถ€ํ„ฐ ํฐ ํ”„๋กœ์ ํŠธ๊นŒ์ง€ ์ ์šฉ ๊ฐ€๋Šฅ
  • Provider ๋ถˆํ•„์š”: Context Provider ์—†์ด ์ „์—ญ ์ƒํƒœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
jsx
function DeepComponent() {
  const count = useStore((state) => state.count);
  return <div>{count}</div>;
}
  • ๋ฆฌ๋ Œ๋”๋ง ์ตœ์ ํ™”: ํ•„์š”ํ•œ ์ƒํƒœ๋งŒ ์„ ํƒ์ ์œผ๋กœ ๊ตฌ๋… ๊ฐ€๋Šฅ
jsx
const count = useStore((state) => state.count);
const increment = useStore((state) => state.increment);
// count๊ฐ€ ๋ณ€ํ•ด๋„ increment๋Š” ๋‹ค์‹œ ๋ Œ๋”๋ง๋˜์ง€ ์•Š์Œ
  • TypeScript ์ง€์› - ํ•„์š”ํ•œ ์ƒํƒœ๋งŒ ์„ ํƒ์ ์œผ๋กœ ๊ตฌ๋… ๊ฐ€๋Šฅ

๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€์˜ ๋น„๊ต โ€‹

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌํŠน์ง•๋ณต์žก๋„๋Ÿฌ๋‹์ปค๋ธŒ
Redux๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ๋งŽ์Œ๋†’์Œ๋†’์Œ
Context API๋‚ด์žฅ ๊ธฐ๋Šฅ, ์„ฑ๋Šฅ ์ด์Šˆ ์žˆ์Œ์ค‘๊ฐ„์ค‘๊ฐ„
Jotai / Recoil์›์ž ๊ธฐ๋ฐ˜ ์ƒํƒœ, ์˜์กด์„ฑ ํ‘œํ˜„์ค‘๊ฐ„์ค‘๊ฐ„
Zustand๊ฐ„๊ฒฐํ•˜๊ณ  ์ง๊ด€์ , ์„ฑ๋Šฅ ์ตœ์ ํ™”๋‚ฎ์Œ๋‚ฎ์Œ

์™œ Zustand๋ฅผ ๋ฐฐ์›Œ์•ผ ํ• ๊นŒ? โ€‹

  • ๋ณต์žกํ•œ ์ƒํƒœ ๊ด€๋ฆฌ ๋ฌธ์ œ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ณ  ์ง๊ด€์ ์œผ๋กœ ํ•ด๊ฒฐ
  • React ํ”„๋กœ์ ํŠธ์— ๋ฐ”๋กœ ์ ์šฉ ๊ฐ€๋Šฅ
  • ๋Ÿฌ๋‹ ์ปค๋ธŒ๊ฐ€ ๋‚ฎ์•„ ํ•™์Šต ํšจ์œจ์ด ๋†’์Œ

Redux vs Zustand โ€‹

  • Redux: ์•ก์…˜, ๋ฆฌ๋“€์„œ, ๋ฏธ๋“ค์›จ์–ด ๋“ฑ ๊ตฌ์กฐ๊ฐ€ ๋ฌด๊ฒ๊ณ  ๋ณต์žก
  • Zustand: ๋‹จ์ผ ์Šคํ† ์–ด, ํ›… ๊ธฐ๋ฐ˜, ์ง๊ด€์ ์ธ API โ†’ ํ•œ ์ค„๋กœ ์ƒํƒœ์™€ ์—…๋ฐ์ดํŠธ ๋กœ์ง์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Œ
    jsx
    // Zustand๋Š” ํ•œ ์ค„๋กœ ์ƒํƒœ + ํ•จ์ˆ˜ ๊ตฌ์„ฑ
    create (() => ({ count: 0, inc: () => {...} }))