Zustand์ Slice ํจํด
๐ป ์ฐ๋ฆฌ ํ๋ก์ ํธ์์ Zustand ์ฌ์ฉ ๋ฐฉ์
zustand๋ React ์ํ ๊ด๋ฆฌ๋ฅผ ์ํ ๊ฒฝ๋ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์
๋๋ค. zustand๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์
์ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ณ , localStorage์ ์ํ๋ฅผ ์ง์(persist)ํ๋๋ก ์ค์ ํ๊ณ ์์ต๋๋ค.
์ ํฌ์ zustand ๊ตฌ์กฐ๋ v4๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋๊ณ ์์ต๋๋ค. ์ต๊ทผ(24๋ 10์ 14์ผ) v5๊ฐ ๋์์ง๋ง, ์์ง ์ต์ํ์ง ์์์ ์ ์ฉ ์ํค์ง๋ ๋ชปํ์ต๋๋ค. ์ข์ ๋ธ๋ก๊ทธ๊ธ์ด ์์ด ๊ณต์ ํฉ๋๋ค (๋ธ๋ก๊ทธ)
ํ์ฌ ํจํด์ ์ฌ๋ผ์ด์ค(Slice) ํจํด์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. Zustand์ ์ฌ๋ผ์ด์ค(slice) ํจํด์ ์ํ(store)๋ฅผ ๋ชจ๋ํํ์ฌ ๊ด๋ฆฌํ๋ ๋ฐฉ์์ ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ๋ฅผ ๋ ผ๋ฆฌ์ ์ผ๋ก ๋ถ๋ฆฌํจ์ผ๋ก์จ ์ ์ง๋ณด์์ฑ๊ณผ ํ์ฅ์ฑ์ ๋์ผ ์ ์์ต๋๋ค.
1. ์ฌ๋ผ์ด์ค ํจํด์ด ํ์ํ ์ด์
Zustand๋ฅผ ์ฌ์ฉํ ๋ ์ํ๊ฐ ์ปค์ง๋ฉด ํ๋์ ํฐ create ์คํ ์ด์ ๋ชจ๋ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒ์ด ๋นํจ์จ์ ์
๋๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฌ๋ผ์ด์ค ํจํด์ ์ฌ์ฉํ๋ฉด ํน์ ๊ธฐ๋ฅ(์: ์ ์ ์ํ, ํ
๋ง ์ํ ๋ฑ)๋ณ๋ก ๋ถ๋ฆฌํ์ฌ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
โ ์ฅ์
- ์ฝ๋ ๊ฐ๋ ์ฑ ์ฆ๊ฐ: ์ํ๋ฅผ ๋ ผ๋ฆฌ์ ์ผ๋ก ๋ถ๋ฆฌํ์ฌ ์ฝ๊ฒ ์ดํดํ ์ ์์
- ์ ์ง๋ณด์์ฑ ํฅ์: ํน์ ๊ธฐ๋ฅ์ ์์ ํ ๋ ๋ค๋ฅธ ์ํ์ ์ํฅ์ ์ฃผ์ง ์์
- ๋ชจ๋ํ ๊ฐ๋ฅ: ์ํ๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ์ ์ํ์ฌ ์ฌ์ฌ์ฉ ๊ฐ๋ฅ
2. ์ฌ๋ผ์ด์ค(Slice) ๋ถ๋ฆฌํ๊ธฐ
๊ฐ ์ํ๋ฅผ ๊ฐ๋ณ์ ์ธ **์ฌ๋ผ์ด์ค(slice)**๋ก ๋ถ๋ฆฌํ์ฌ ๊ด๋ฆฌํฉ๋๋ค.
1๏ธโฃ ์ฌ๋ผ์ด์ค ์ ์
// counterSlice.ts
import { StateCreator } from 'zustand';
export interface CounterSlice {
count: number;
increase: () => void;
decrease: () => void;
}
export const createCounterSlice: StateCreator<
CounterSlice,
[],
[],
CounterSlice
> = (set) => ({
count: 0,
increase: () => set((state) => ({ count: state.count + 1 })),
decrease: () => set((state) => ({ count: state.count - 1 })),
});
CounterSlice์ธํฐํ์ด์ค๋ฅผ ์ ์ํ์ฌ ์ํ์ ์ก์ ์ ํ์ ์ผ๋ก ๋ช ์createCounterSliceํจ์์์set์ ์ด์ฉํด ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ๋ก์ง์ ๊ตฌํ
2๏ธโฃ ์ฌ๋ฌ ์ฌ๋ผ์ด์ค ํฉ์น๊ธฐ
// useStore.ts
import { create } from 'zustand';
import { CounterSlice, createCounterSlice } from './counterSlice';
import { ThemeSlice, createThemeSlice } from './themeSlice';
type Store = CounterSlice & ThemeSlice; //์ฌ๋ฌ๊ฐ์ slice ํตํฉ
const useStore = create<Store>()((...a) => ({
...createCounterSlice(...a),
...createThemeSlice(...a),
}));
export default useStore;
createํจ์์์ ์ฌ๋ฌ ์ฌ๋ผ์ด์ค๋ฅผ ๋ณํฉํ์ฌ ํ๋์ ์คํ ์ด๋ก ์์ฑ...createCounterSlice(...a)๋ฅผ ํตํด ์ํ๋ฅผ ๊ฒฐํฉ
3. ์ ๋ฆฌ
โ ์ฌ๋ผ์ด์ค ํจํด์ ํต์ฌ ๊ฐ๋
- ๊ธฐ๋ฅ๋ณ๋ก ์ํ๋ฅผ ๋ถ๋ฆฌํ์ฌ ์ ์ง๋ณด์์ฑ์ ๋์
- ์ฌ๋ฌ ์ฌ๋ผ์ด์ค๋ฅผ ๊ฒฐํฉํ์ฌ ํ๋์ ์ํ๋ก ํตํฉ
- Zustand์
StateCreator๋ฅผ ํ์ฉํ์ฌ ์ฌ๋ผ์ด์ค ํ์ ์ ์์ ํ๊ฒ ๊ด๋ฆฌ
โ ์ธ์ ์ฌ์ฉํ ๊น?
- ์ ํ๋ฆฌ์ผ์ด์ ์ํ๊ฐ ์ ์ ์ปค์ง ๋
- ์ฌ๋ฌ ์ํ(์:
user,theme,cart๋ฑ)๋ฅผ ๊ด๋ฆฌํด์ผ ํ ๋ - ์ฝ๋์ ๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์๋ฅผ ๊ฐ์ ํ๊ณ ์ถ์ ๋
๋๊ธ
์์ง ๋๊ธ์ด ์์ด์. ์ฒซ ๋๊ธ์ ๋จ๊ฒจ๋ณด์ธ์.