Hello Kitty Eyes Shut
๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ’ป๊ณต๋ถ€ ๊ธฐ๋ก/๐Ÿ“Œ Frontend

[Frontend] Zustand

๋ฐ˜์‘ํ˜•

 

 

 

 

 

๐Ÿป Zustand๋ž€?

React์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

 

Zustand๋Š” React ์•ฑ์—์„œ ์ปดํฌ๋„ŒํŠธ ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ๋” ํŽธํ•˜๊ฒŒ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๋„๊ตฌ์ด๋‹ค.

์ด ๊ธ€์—์„œ๋Š” Zustand๊ฐ€ ์–ด๋–ค ์—ญํ• ์„ ํ•˜๋Š”์ง€, ์™œ ํ•„์š”ํ•œ์ง€, ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€๋ฅผ ์ฐจ๊ทผ์ฐจ๊ทผ ์•Œ์•„๋ณด๊ณ ์ž ํ•œ๋‹ค.

 


โœจ ์ƒํƒœ ๊ด€๋ฆฌ๋ž€?

React์—์„œ๋Š” ์ปดํฌ๋„ŒํŠธ ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ๋•Œ state (์ƒํƒœ)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋กœ๊ทธ์ธ ์—ฌ๋ถ€๋‚˜ ๋‹คํฌ ๋ชจ๋“œ ์„ค์ •์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ์—์„œ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ’์ด ์žˆ๋‹ค๋ฉด ์ด๋ฅผ ์ƒํƒœ๋กœ ๊ด€๋ฆฌํ•ด์•ผ ํ•  ๊ฒƒ์ด๋‹ค.

const [isLoggedIn, setIsLoggedIn] = useState(false);

 

๊ทธ๋Ÿฐ๋ฐ ์ด๋ ‡๊ฒŒ ์ƒํƒœ๊ฐ€ ์ ์  ๋งŽ์•„์ง€๊ณ , ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ์—์„œ ํ•จ๊ป˜ ์จ์•ผ ํ•œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ?

๐Ÿ‘‰ ์ด๋Ÿด ๋•Œ ํ•„์š”ํ•œ ๊ฒƒ์ด ๋ฐ”๋กœ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.

 


๐Ÿ˜ต ๊ธฐ์กด ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ฌธ์ œ์ 

React๋ฅผ ์ฒ˜์Œ ๋ฐฐ์šฐ๋Š” ์‚ฌ๋žŒ๋“ค์€ ์ข…์ข… ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ๋กœ Redux๋ฅผ ์ ‘ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ,

Redux๋Š” ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€๋งŒ, ์‚ฌ์šฉํ•˜๊ธฐ์—” ์•„๋ž˜์™€ ๊ฐ™์€ ๋‹จ์ ๋“ค์ด ์žˆ๋‹ค.

  • ์„ค์ •ํ•ด์•ผ ํ•  ๊ฒŒ ๋งŽ๋‹ค.
  • ์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด์ง€๊ณ  ๋ณต์žกํ•˜๋‹ค.
  • ๋Ÿฌ๋‹ ์ปค๋ธŒ๊ฐ€ ๋†’์•„์„œ ์ดˆ๋ณด์ž์—๊ฒŒ๋Š” ๋ถ€๋‹ด์ด ํฌ๋‹ค.

 

๊ทธ๋ž˜์„œ ๋“ฑ์žฅํ•œ ๊ฒƒ์ด Zustand์ด๋‹ค.

 

Zustand๋Š” ๋…์ผ์–ด๋กœ '์ƒํƒœ'๋ผ๋Š” ๋œป์œผ๋กœ,

React 3D ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ react-three-fiber๋ฅผ ๋งŒ๋“  ํŒ€ PMNDRS์—์„œ ๊ฐœ๋ฐœํ–ˆ๋‹ค.

 


๐Ÿš€ ํ•ต์‹ฌ ํŠน์ง•

ํŠน์ง• ์„ค๋ช…
๐Ÿง  ์•„์ฃผ ์‹ฌํ”Œํ•œ API ๋ช‡ ์ค„๋งŒ์œผ๋กœ ์Šคํ† ์–ด ์ƒ์„ฑ ์™„๋ฃŒ
๐Ÿงต Context ํ•„์š” ์—†์Œ Provider ์—†์ด๋„ ์ƒํƒœ ๊ณต์œ  ๊ฐ€๋Šฅ
๐Ÿ‡ ๋น ๋ฅธ ์†๋„ ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง ์ตœ์†Œํ™”, ์„ฑ๋Šฅ ์ตœ์ ํ™”
๐ŸŽฏ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์™„๋ฒฝ ์ง€์› ์ œ๋„ค๋ฆญ ๊ธฐ๋ฐ˜์œผ๋กœ ์ถ”๋ก  ์ž˜ ๋จ
๐Ÿ›  ๋ฏธ๋“ค์›จ์–ด๋„ ๊ฐ€๋Šฅ Persist (๋กœ์ปฌ ์ €์žฅ), Devtools ์—ฐ๋™ ๋“ฑ

 


๐Ÿ›  ์„ค์น˜ ๋ฐ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

1๏ธโƒฃ ์„ค์น˜

pnpm install zustand
# ๋˜๋Š”
npm install zustand

 

2๏ธโƒฃ ์ƒํƒœ ๋งŒ๋“ค๊ธฐ (์Šคํ† ์–ด ์ƒ์„ฑ)

// store.ts
import { create } from 'zustand';

type BearState = {
  bears: number;
  increase: () => void;
};

export const useBearStore = create<BearState>((set) => ({
  bears: 0,
  increase: () => set((state) => ({ bears: state.bears + 1 })),
}));

 

3๏ธโƒฃ ์ƒํƒœ ์‚ฌ์šฉํ•˜๊ธฐ

// App.tsx
import { useBearStore } from './store';

function App() {
  const bears = useBearStore((state) => state.bears);
  const increase = useBearStore((state) => state.increase);

  return (
    <div>
      <h1>๊ณฐ์˜ ์ˆ˜: {bears}</h1>
      <button onClick={increase}>๊ณฐ ์ถ”๊ฐ€ํ•˜๊ธฐ ๐Ÿป</button>
    </div>
  );
}

 

 


๐Ÿค” Zustand๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ด์œ 

ํ•ญ๋ชฉ Redux Zustand
์ฝ”๋“œ๋Ÿ‰ ๋งŽ์Œ ๋งค์šฐ ์ ์Œ
๋Ÿฌ๋‹์ปค๋ธŒ ๋†’์Œ ๋‚ฎ์Œ
Provider ํ•„์š” ์—ฌ๋ถ€ โญ• โŒ
์„ฑ๋Šฅ ์ตœ์ ํ™” ์ง์ ‘ ํ•ด์•ผ ํ•จ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ตœ์ ํ™” ์ž˜ ๋จ
Devtools ์žˆ์Œ ์žˆ์Œ

 


๐Ÿ“ ๊ฒฐ๋ก 

Zustand๋Š” ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ๊ฐ€๋ณ๊ณ  ์‹ฌํ”Œํ•˜๊ฒŒ ํ•˜๊ณ  ์‹ถ์€ React ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์•„์ฃผ ์ข‹์€ ์„ ํƒ์ผ ๊ฒƒ์ด๋‹ค.

  • Redux๊ฐ€ ๋„ˆ๋ฌด ๋ณต์žกํ•˜๋‹ค๊ณ  ๋А๋ผ๋Š” ์‚ฌ๋žŒ ๐Ÿ–๐Ÿป
  • ๊ฐ„๋‹จํ•œ ๊ธ€๋กœ๋ฒŒ ์ƒํƒœ๊ฐ€ ํ•„์š”ํ•œ ์‚ฌ๋žŒ ๐Ÿ–๐Ÿป
  • ๋น ๋ฅธ ๊ฐœ๋ฐœ๊ณผ ์„ฑ๋Šฅ์„ ๋ชจ๋‘ ์ฑ™๊ธฐ๊ณ  ์‹ถ์€ ์‚ฌ๋žŒ ๐Ÿ–๐Ÿป

๐Ÿ‘‰๐Ÿป Zustand๋ฅผ ์‚ฌ์šฉํ•ด๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

๋ฐ˜์‘ํ˜•