ํ๋ก ํธ์๋ ์ํ ๊ด๋ฆฌ ๋๊ตฌ๋ ์ ๋ง ๋ง๋ค.
๊ทธ ์ค์์๋ ์ต๊ทผ ๋ค์ด React์์ ๊ฐ์ฅ ํซํ ๊ฒฝ๋ ์ํ ๊ด๋ฆฌ ๋๊ตฌ๊ฐ ๋ฐ๋ก Zustand์ด๋ค.
์ด๋ฒ ๊ธ์ Zustand๋ฅผ ์ฒ์ ๋ค์ด๋ณด๋ ์ฌ๋๋ ๊ฐ๋
๋ถํฐ ์ค์ ๊น์ง ๋ฐ๋ก ๋ฐ๋ผ์ฌ ์ ์๊ฒ
์์ ๊ธฐ์ด๋ถํฐ ์ค์ต ์ฝ๋, ์ฅ๋จ์ , ์ฌ์ฉ ํ๊น์ง ์ ๋ฆฌํด๋ดค๋ค.
๋ ์ผ์ด๋ก "์ํ(state)"๋ผ๋ ๋ป์ด๊ณ ,
"๊ฐ๋ณ๊ณ ์ง๊ด์ ์ธ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ"
๐ฆ ์ค์น ๋ฐฉ๋ฒ:
npm install zustand
# ๋๋
yarn add zustand
// store.ts
import { create } from 'zustand';
type State = {
count: number;
increase: () => void;
decrease: () => void;
};
export const useCounterStore = create<State>((set) => ({
count: 0,
increase: () => set((state) => ({ count: state.count + 1 })),
decrease: () => set((state) => ({ count: state.count - 1 })),
}));
// App.tsx
import { useCounterStore } from './store';
export default function App() {
const { count, increase, decrease } = useCounterStore();
return (
<div>
<h1>{count}</h1>
<button onClick={increase}>+1</button>
<button onClick={decrease}>-1</button>
</div>
);
}
๐ก useCounterStore()
ํ
๋ง ๋ถ๋ฌ์ ์ด๋์๋ ์ํ๋ฅผ ๊ณต์ ํ ์ ์๋ค.
Context, Provider ์ ํ ํ์ ์์!
const count = useCounterStore((state) => state.count);
useSelector
์ ๋น์ทํ์ง๋ง ํจ์ฌ ๊ฐ๋ณ๊ณ ์์ ๋กญ๋ค// userStore.ts
export const useUserStore = create(() => ({
name: 'unknown',
setName: (name: string) => set({ name }),
}));
// uiStore.ts
export const useUIStore = create(() => ({
isModalOpen: false,
toggleModal: () => set((s) => ({ isModalOpen: !s.isModalOpen })),
}));
ํญ๋ชฉ | Redux | Zustand |
---|---|---|
์ฝ๋๋ | ๋ง์ | ์ ์ (Hooks ๊ธฐ๋ฐ) |
๋ณด์ผ๋ฌํ๋ ์ดํธ | ๋ง์ (action, reducer ๋ฑ) | ๊ฑฐ์ ์์ |
๋ฆฌ๋ ๋๋ง ๊ด๋ฆฌ | ์ง์ memoization ํ์ | ์๋์ผ๋ก ์ต์ํํจ |
Provider ํ์ | ์์ | โ ํ์ ์์ |
TypeScript ์ง์ | O | O (ํ์ ์ถ๋ก ๋ ๋ฐ์ด๋จ) |
Zustand๋ Redux์ฒ๋ผ "์ด๋ ต๊ฒ ๋ฐฐ์ฐ๊ณ ์จ์ผ ํ๋ค"๋ ๋๋์ด ์๋๋ผ
"Hook์ฒ๋ผ ์์ฐ์ค๋ฝ๊ฒ ์จ์ง๋๋ฐ, ์ ์ญ ์ํ๊ฐ ๋๋ค"๋ ์ ์ด ๋๋ฌด ์ข์๋ค.
ํนํ ์ํ ๊ตฌ๋
์ต์ ํ๊ฐ ์ ๋ผ์, ๋ฆฌ๋ ๋๋ง ์ฑ๋ฅ ์ด์๋ ๊ฑฐ์ ์์๋ค.
์ง๊ธ์ ๊ฑฐ์ ๋ชจ๋ ํ๋ก์ ํธ์์ ๊ธฐ๋ณธ ์ํ ๊ด๋ฆฌ๋ Zustand๋ก ์ฌ์ฉ ์ค์ด๋ค.
๐พ โ์ํ ๊ด๋ฆฌ๊ฐ ๋ฌด๊ฒ๊ณ ๋ณต์กํ๋ค๊ณ ๋๊ปด์ก๋ค๋ฉด,
Zustand๋ ํ ๋ฒ์ฏค ๊ผญ ์จ๋ณผ๋งํ ๋์์ด๋ค.โ