๐ 03. ์ฌ๋ผ์ด์ค ํจํด (Slice Pattern): ์คํ ์ด๋ฅผ ์กฐ๋ฆฝ์์ผ๋ก ์ชผ๊ฐ๊ธฐ
๐ ๊ฐ์
๊ฑฐ๋ํด์ง Zustand ์คํ ์ด๋ฅผ ๊ธฐ๋ฅ๋ณ๋ก ๋ถ๋ฆฌํ๊ณ ์กฐ๋ฆฝํ๋ ๋ง์ดํฌ๋ก ์ํคํ ์ฒ
๐ฏ ์ด ์น์ ์ ์ฝ๊ณ ๋๋ฉด:
- ๋น๋ํด์ง ์คํ ์ด๋ฅผ ๊ด์ฌ์ฌ(๋๋ฉ์ธ)๋ณ๋ก ๋ถ๋ฆฌํ๋ ์กฐ๊ฐ(Slice) ํจํด์ ๊ตฌํํ ์ ์๋ค.
- ์ฌ๋ฌ ๊ฐ์ Slice๋ฅผ ํ๋๋ก ๊ฒฐํฉํ๊ณ , Slice ๊ฐ์ ์ํ๋ฅผ ๊ต์ฐจ ์ฐธ์กฐ(ํต์ )ํ๋ ๋ฐฉ๋ฒ์ ์ดํดํ๋ค.
๐ ๋ชฉ์ฐจ
- ๐ค ์ ์์์ผ ํ๋๊ฐ
- ๐๏ธ 1. ์คํ ์ด๋ฅผ ์กฐ๊ฐ๋ด๊ธฐ: Slice ์์ฑ
- ๐งฉ 2. ๋ฉ์ธ ์คํ ์ด์์ ์กฐ๋ฆฝ(Combine)ํ๊ธฐ
- โก 3. Slice ๊ฐ์ ํต์ (๊ต์ฐจ ์ฐธ์กฐ)
- ๐๏ธโโ๏ธ ์์ฒ ์ ํ ์คํธ ํ์ (Q&A)
๐ ์ด ๋ฌธ์๋ฅผ ์ฝ๊ธฐ ์ ์
โฑ๏ธ ์์ ์ฝ๊ธฐ ์๊ฐ: 12๋ถ / ํต์ฌ ํํธ: 7๋ถ
๐บ๏ธ ์ด ๋ฌธ์์ ํ๋ฆ
์คํ ์ด ๋น๋ํ ๋ฌธ์ ์ โ Slice ๋ถ๋ฆฌ ๊ธฐ๋ฒ โ ์ค์ ํตํฉ ์คํ ์ด(BoundStore) ๊ฒฐํฉ โ Slice ๊ฐ ํต์
๐บ๏ธ ์ด ๋ฌธ์์ ๋ฐฐ๊ฒฝ ์ธ๊ณ๊ด: '์์๋ค ์ปค๋ฎค๋ํฐ'
- ๐ฃ ์์ฒ ( ์ ์
): "์ํธ ๋ฆฌ๋ ๋, ์ด์ ๋ง์ํ์ ๋๋ก ์คํ ์ด ๋์ค๋ฅผ ๊น๊ฒ ์ ํ๋ ค๊ณ ๋
ธ๋ ฅ ์ค์ธ๋ฐ์. ๊ทธ๋ฌ๋ค ๋ณด๋๊น ์ ์ฒด ์ํ๋ฅผ ๋ค๊ณ ์๋
useAppStore.tsํ์ผ์ด 500์ค์ด ๋์ด๊ฐ์ด์! ๋ก์ง ์ฐพ๊ธฐ๋ ํ๋ค๊ณ ๋๋ฌด ๋ฑ๋ฑํ๋ฐ ์ด๊ฑฐ ํ์ผ ๋จ์๋ก ๋ค ๋ถ๋ฆฌํด์ผ ํ ๊น์?" - ๐ฆ ์ํธ ( ๋ฆฌ๋ ): "์์ฒ ๋, ์คํ ์ด๊ฐ ๋น๋ํด์ง๋ ํ์์ ๊ฒช๊ณ ๊ณ์๋๊ตฐ์. Zustand๋ ์ฌ๋ฌ ๊ฐ์ ์์ ์คํ ์ด๋ฅผ ๋ง๋ค์ด๋ ๋์ง๋ง, ์ฐ๊ด๋ ์ํ๋ผ๋ฆฌ ์ฎ์ด๋ ๊ตฌ์กฐ๋ผ๋ฉด ํ๋์ ํฐ ์คํ ์ด๋ฅผ ์ ์งํ๋ ๋ด๋ถ๋ฅผ ์กฐ๋ฆฝ์ ๋ธ๋ก์ฒ๋ผ ์ชผ๊ฐ์ ํฉ์น๋ '์ฌ๋ผ์ด์ค ํจํด(Slice Pattern)'์ ์ ์ฉํด์ผ ์ ์ง๋ณด์๋ ์ก๊ณ ์ํ ๊ฐ ํต์ ๋ ํธํด์ง๋๋ค. ๋ ๊ณ ์กฐ๋ฆฝ๋ฒ์ ๋ฐฐ์๋ด ์๋ค."
๐ค ์ ์์์ผ ํ๋๊ฐ
Zustand๋ก ์ฑ์ ๊ตฌ์ถํ๋ค ๋ณด๋ฉด, ์ ์ญ ์ํ๋ ํ์ฐ์ ์ผ๋ก ๋น๋ํด์ง๋๋ค. ์ธ์ฆ/์ธ๊ฐ๋ฅผ ๋ด๋นํ๋ User ๋๋ฉ์ธ, ๋คํฌ ๋ชจ๋/์ฌ์ด๋๋ฐ ์ฌ๋ถ๋ฅผ ๊ธฐ์ตํ๋ UI ๋๋ฉ์ธ, ๊ทธ๋ฆฌ๊ณ ์ ์ ๊ฐ ์์ฑ ์ค์ด๋ ์์ ๊ฒ์ํ ํผ ๋ฐ์ดํฐ ๋ฑ ์ญํ ์ด ์ ํ ๋ค๋ฅธ ์ํ๋ค์ด ํ ํ์ผ์ ํผ์ฌํ๊ฒ ๋๋ฉด ์ ์ง๋ณด์์ฑ์ ๋ ๋จ์ด์ง๋๋ค.
Redux์์๋ ๋ณดํต combineReducers๋ฅผ ์ฌ์ฉํด ๊ด์ฌ์ฌ๋ฅผ ๋ถ๋ฆฌํฉ๋๋ค. Zustand์์๋ ์ด์ ์ ์ฌํ์ง๋ง ํจ์ฌ ์ง๊ด์ ์ธ Slice(์กฐ๊ฐ) ํจํด์ ๊ณต์์ผ๋ก ๊ถ์ฅํฉ๋๋ค.
๊ฐ ๊ธฐ๋ฅ๋ณ ์กฐ๊ฐ(Slice)์ ๋ณ๋์ ํ์ผ์ด๋ ํจ์๋ก ๋
๋ฆฝ์ํค๊ณ , ๋ฉ์ธ ์คํ ์ด(useBoundStore)์์ ๊ทธ ์กฐ๊ฐ๋ค์ ๊ฒฐํฉ(Merge)ํ์ฌ ๋จ์ผ ์ฐฝ๊ตฌ(Single Source)๋ฅผ ์ ๊ณตํ๋ ์ํคํ
์ฒ์
๋๋ค.
๐๏ธ 1. ์คํ ์ด๋ฅผ ์กฐ๊ฐ๋ด๊ธฐ: Slice ์์ฑ
๋จผ์ ๋ชจ๋ ๊ฒ์ ๋ค๊ณ ์๋ ๋ฑ๋ฑํ ์คํ ์ด๋ฅผ ๊ธฐ๋ฅ(๋๋ฉ์ธ)๋ณ ์กฐ๊ฐ์ผ๋ก ๋ถ๋ฆฌํด๋ณด๊ฒ ์ต๋๋ค.
A. ์ผ๋ฐ ์คํ ์ด(์ ํต ๋ฐฉ์)์ ๋ฌธ์
// ๐ฃ ์์ฒ : ํ์ผ ํ๋์ ๋ค ๋๋ ค๋ฐ์๋๋ ์ฝ๋๊ฐ 500์ค์ด์์...
const useStore = create((set) => ({
user: null, // ์ ์ ๊ธฐ๋ฅ
login: () => { ... },
isDarkMode: false, // UI ๊ธฐ๋ฅ
toggleTheme: () => { ... },
cartItems: [], // ์ฅ๋ฐ๊ตฌ๋ ๊ธฐ๋ฅ
addItem: () => { ... },
}));B. Slice ์ชผ๊ฐ๊ธฐ (๊ด์ฌ์ฌ ๋ถ๋ฆฌ)
๊ฐ Slice๋ Zustand์ StateCreator ํ์
์ ์ฌ์ฉํ์ฌ ๋
๋ฆฝ์ ์ผ๋ก ์ค๊ณํฉ๋๋ค. ์ด์ ์ ์ ๋ก์ง๊ณผ ์ฅ๋ฐ๊ตฌ๋ ๋ก์ง์ด ์๋ก์ ์์ผ์์ ๋ถ๋ฆฌ๋ฉ๋๋ค.
// features/user/userSlice.ts
import { StateCreator } from 'zustand';
export interface UserSlice {
user: string | null;
login: (name: string) => void;
logout: () => void;
}
// ๐ฆ ์ํธ: ์ด Slice๋ ์๊ธฐ๊ฐ User ๊ด๋ จ๋ ์ผ๋ง ํ๋ค๋ ๊ฒ์ ์ง์คํด์.
export const createUserSlice: StateCreator<UserSlice> = (set) => ({
user: null,
login: (name) => set({ user: name }),
logout: () => set({ user: null }),
});// features/cart/cartSlice.ts
import { StateCreator } from 'zustand';
export interface CartSlice {
cartItems: string[];
addItem: (item: string) => void;
}
export const createCartSlice: StateCreator<CartSlice> = (set) => ({
cartItems: [],
addItem: (item) => set((state) => ({ cartItems: [...state.cartItems, item] })),
});๐งฉ 2. ๋ฉ์ธ ์คํ ์ด์์ ์กฐ๋ฆฝ(Combine)ํ๊ธฐ
์, ํฉ์ด์ ธ ์๋ ์กฐ๊ฐ๋ค์ ๋ฉ์ธ ์คํ ์ด์์ ํ๋๋ก ๋ญ์ณ๋ณด๊ฒ ์ต๋๋ค. ์ด ๋ฉ์ธ ์คํ ์ด๋ฅผ ๋ณดํต Bound Store(๋ฌถ์ธ ์คํ ์ด)๋ผ๊ณ ๋ถ๋ฆ
๋๋ค.
์คํ๋ ๋ ์ฐ์ฐ์(...)๋ฅผ ์ด์ฉํด ๊ฐ๊ฐ์ Slice ์์ฑ ํจ์๋ฅผ ํธ์ถํ๊ณ ๊ฒฐํฉํฉ๋๋ค. ์ด๋ ์ํ ํ์
(์ธํฐํ์ด์ค)๋ ํ๋๋ก ํฉ์นฉ๋๋ค(Intersection Type).
// store/useBoundStore.ts
import { create } from 'zustand';
import { UserSlice, createUserSlice } from '../features/user/userSlice';
import { CartSlice, createCartSlice } from '../features/cart/cartSlice';
// ๐ฃ ์์ฒ : ์ฌ๊ธฐ์ ํ์
๋ค์ '+' ๊ธฐํธ์ฒ๋ผ(&) ํฉ์น๋๊ตฐ์!
type StoreState = UserSlice & CartSlice;
// ๐ฆ ์ํธ: set, get, api๋ฅผ ๊ฐ๊ฐ์ Slice ํจ์์ ๊ทธ๋๋ก ํ ์ค(Toss)ํฉ๋๋ค.
export const useBoundStore = create<StoreState>()((...a) => ({
...createUserSlice(...a),
...createCartSlice(...a),
}));์ด๋ ๊ฒ ํ๋ฉด ์ปดํฌ๋ํธ ์
์ฅ์์๋ ๋จ์ผ ์คํ ์ด(useBoundStore) ํ๋๋ง ์ํฌํธํ๊ณ , ์ ์ ์ ๋ณด๋ ์ฅ๋ฐ๊ตฌ๋ ์ ๋ณด๋ ์์ ๋ฝ์(Select)๋ค ์ธ ์ ์์ต๋๋ค.
โก 3. Slice ๊ฐ์ ํต์ (๊ต์ฐจ ์ฐธ์กฐ)
ํ๋์ ํฐ ์คํ ์ด ๋ด์์ Slice๋ค๋ผ๋ฆฌ ์๋ก ์ํ๋ฅผ ์กฐ์ํด์ผ ํ ์ํฉ์ด ์๊ธฐ๊ธฐ๋ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ก๊ทธ์์์ ํ๋ฉด ์ฅ๋ฐ๊ตฌ๋๋ ๊ฐ์ด ์ด๊ธฐํ๋์ด์ผ ํ๋ค๋ฉด ์ด๋จ๊น์?
์ด๋ Zustand์ ๊ฐ๋ ฅํจ์ด ๋๋ฌ๋ฉ๋๋ค. ๊ฐ ์กฐ๊ฐ(Slice)๋ค์ get() ํจ์๋ฅผ ํตํด ์ ์ฒด ์คํ ์ด(Bound Store)์ ์ํ๋ฅผ ์ฝ๊ณ ์
๋ฐ์ดํธํ ์ ์์ต๋๋ค.
import { StateCreator } from 'zustand';
// ๐ก ๊ต์ฐจ ์ฐธ์กฐ๋ฅผ ์ํด ์ ์ฒด ์คํ ์ด ํ์
์ ์ ๋ค๋ฆญ์ ๋ฃ์ด์ผ ํด์.
import { StoreState } from '../../store/useBoundStore';
export const createUserSlice: StateCreator<
StoreState,
[], // middleware
[],
UserSlice
> = (set, get) => ({
user: null,
login: (name) => set({ user: name }),
// ๐ค ๋ก๊ทธ์์ํ๋ฉด ์ฅ๋ฐ๊ตฌ๋๋ ๋น์ฐ์!
logout: () => {
// ๐ฆ ์ํธ: ํ์ฌ ์คํ ์ด ๊ตฌ์กฐ์ Cart์ cartItems ํ๋๋ฅผ ์ง์ ๋ฐ์ด๋ฒ๋ฆด ์ ์์ด์.
set({ user: null, cartItems: [] });
// ๋ง์ฝ CartSlice์ ๋น์ฐ๊ธฐ ํจ์๋ฅผ ํธ์ถํ๊ณ ์ถ๋ค๋ฉด:
// get().clearCart();
},
});๐ ๋์์ธ ์์น:
Slice ๊ฐ ๊ฒฐํฉ๋๊ฐ ๋๋ฌด ๋์์ง๋ฉด ๋จ์ผ ๊ธฐ๋ฅ์ผ๋ก์์ ๋
๋ฆฝ์ฑ์ด ๋ฌด๋์ง๋๋ค. ์ ์ ๊ฐ ์ฅ๋ฐ๊ตฌ๋๋ฅผ ๋น์ฐ๋ ์ ๋๋ ๊ด์ฐฎ์ง๋ง, ์๋ก์ ์ํ๋ฅผ ๋ฏธ๋ก์ฒ๋ผ ์ฐธ์กฐํ๊ฒ ์ง์ง ๋ง์ธ์! ๊ฐ๊ธ์ ์ด๋ฒคํธ ์ค์ฌ ๋ถ๋ฆฌ๊ฐ ์ ์ง๋ณด์์ ์ ๋ฆฌํฉ๋๋ค.
๐ ๋ง๋ฌด๋ฆฌ ํด์ฆ
Q1. Zustand์์ ๋น๋ํด์ง๋ ๋ฉ์ธ ์คํ ์ด๋ฅผ ๋ถ๋ฆฌํ ๋ ์ฌ์ฉํ๋ ๊ฐ์ฅ ํํ ํจํด์ ๋ฌด์์ธ๊ฐ์?
- A) ์ฌ๋ผ์ด์ค ํจํด(Slice Pattern)
- B) ์ปจํ ์คํธ ๋ถ๋ฆฌ ํจํด(Context Split Pattern)
- C) ๊ธ๋ก๋ฒ ์ต์ ๋ฒ ํจํด(Global Observer Pattern)
- D) ๋ค์ค ์คํ ์ด ๊ฒฐํฉ ํจํด(Multiple Store Combine Pattern)
โ
์ ๋ต: A
๐ก ์์ธ ํด์ค:
- ์๋ฆฌ ์ค๋ช
: ๋ฉ์ธ ์คํ ์ด์ ๊ด๋ฆฌ ํฌ์ธํธ๊ฐ ์ปค์ง๋ ๊ฒ์ ๋ง๊ธฐ ์ํด ๋๋ฉ์ธ๋ณ ๊ด์ฌ์ฌ๋ก ๋ถ๋ฆฌํ๊ณ ์ด๋ฅผ ๋จ์ผ
Bound Store์์ ๊ฒฐํฉ($merge)ํ๋ ์ํคํ ์ฒ๋ฅผ ์ฌ๋ผ์ด์ค ํจํด์ด๋ผ๊ณ ๋ถ๋ฆ ๋๋ค. - ์ค๋ต ํผ๋๋ฐฑ: "์์ฒ ๋, ์ฌ๋ฌ ๊ฐ์ ๋
๋ฆฝ์ ์ธ
useStore๋ฅผ ๋ฌดํ์ ์ฐ์ด๋ด๋ ๋ฐฉ์์ ๊ต์ฐจ ์ฐธ์กฐ ํต์ ์ด ์ด๋ ค์์ง๋ค๋ ๊ฑธ ์์ผ์๋ฉด ์ ๋ฉ๋๋ค." - ๐ ํต์ฌ ๊ธฐ์ต๋ฒ: ๐ฆ ์ํธ: "๊ฑฐ๋ํด์ง ์คํ ์ด๋ ํผ์ ์กฐ๊ฐ ์๋ฅด๋ฏ ๊ด์ฌ์ฌ๋๋ก ์ฌ๋ผ์ด์ค(Slice) ์ณ์ ๊ด๋ฆฌํ์ธ์."
Q2. Slice ๊ฐ์ ์๋ก์ ์ํ๋ฅผ ์ฐธ์กฐํ๊ฑฐ๋ ์ ๋ฐ์ดํธ(๊ต์ฐจ ์ฐธ์กฐ)ํด์ผ ํ ๋, Zustand ์ฌ๋ผ์ด์ค ๋ด์์ ์ด๋ป๊ฒ ์ ๊ทผํ๋์?
- A) Redux์
dispatch๋ฅผ ์ฌ์ฉํด ์ก์ ํต์ ์ ํ๋ค. - B) ์ฌ๋ผ์ด์ค๋ฅผ ์ ์ํ ๋ ์ฃผ์
๋ฐ์
get()ํจ์๋ฅผ ์ด์ฉํด ์ ์ฒด ์ํ์ ์ ๊ทผํ๋ค. - C) ๋ค๋ฅธ ์ฌ๋ผ์ด์ค ํ์ผ์ ์ง์
importํด์ ํด๋น ๊ฐ์ฒด์ ์์ฑ์ ๋ณ๊ฒฝํ๋ค. - D) ๊ต์ฐจ ์ฐธ์กฐ๋ ์ ๋ ๋ถ๊ฐ๋ฅํ๋ฏ๋ก ๊ณตํต ๋ถ๋ชจ ์ฌ๋ผ์ด์ค๋ฅผ ์๋ก ๋ง๋ค์ด์ผ ํ๋ค.
โ
์ ๋ต: B
๐ก ์์ธ ํด์ค:
- ์๋ฆฌ ์ค๋ช
: ์ฌ๋ผ์ด์ค ์์ฑ ํจ์(StateCreator)๋ ๋ฌถ์ฌ์ง ์ ์ฒด ์คํ ์ด(Bound Store)์ ํ์
์ปจํ
์คํธ ์์์ ์ ์๋ฉ๋๋ค. ๋ฐ๋ผ์ ๋ด๋ถ์
get()ํจ์๋ฅผ ํธ์ถํ๋ฉด ๋ค๋ฅธ ์ฌ๋ผ์ด์ค์ ์ํ๋ฅผ ์ฝ์ ์ ์๊ณ ,set()์ ํตํด ์์ ๋ ๊ฐ๋ฅํฉ๋๋ค. - ์ค๋ต ํผ๋๋ฐฑ: "์์ฒ ๋, ์ฌ๋ผ์ด์ค๋ฅผ ์กฐ๊ฐ๋๋ค๊ณ ์๋ก ์ํต์ด ๋๊ธฐ๋ ๊ฒ ์๋์์. ํฑ๋๋ฐํด๋ค์
get์ด๋ผ๋ ์ถ์ผ๋ก ์ฐ๊ฒฐ๋์ด ์์ต๋๋ค." - ๐ ํต์ฌ ๊ธฐ์ต๋ฒ: ๐ฆ ์ํธ: "๋ค๋ฅธ ๋ถ์(Slice) ์๋ฅ๊ฐ ํ์ํ ๋ ๊ฐ์ฅ ๋น ๋ฅธ ๋ฌธ์
get()์ ๋๋ค."
Q3. ๐๏ธโโ๏ธ ์์ฒ ์ ํ ์คํธ ํ์ (Q&A)
์์ฒ ์ด๊ฐ ์ผํ ์ฑ์ ์คํ ์ด๋ฅผ ๋ง๋ค๋ฉด์ UI ์ํ ๊ด๋ฆฌ ์กฐ๊ฐ(
UISlice)๊ณผ ๋คํฌ ๋ชจ๋ ํ ๊ธ ํจ์, ๊ทธ๋ฆฌ๊ณ User ๋๋ฉ์ธ์ ๊ด๋ฆฌ ์ค์ด์์ต๋๋ค. ์คํ ์ด๋ฅผ ๋ถ๋ฆฌ($useUIStore, $useUserStore)ํ์ฌ ์ฌ๋ฌ ๊ฐ์createํจ์๋ฅผ ๋ง๋ค์์ ๋, ํน์ ์ปดํฌ๋ํธ์์ ๋ก๊ทธ์ธ ์ ๋ณด์ ๋คํฌ๋ชจ๋ ์ ๋ณด๋ฅผ ๋ ๋ค ์จ์ผ ํ๋ค๋ฉด ๊ฐ๊ฐ ๋ฐ๋ก ํ (hook)์ ํธ์ถํด์ผ ํฉ๋๋ค. ๋ฐ๋ฉด, ์ฌ๋ผ์ด์ค ํจํด์ ์ฌ์ฉํ์ฌ ๋ฌถ์ ์คํ ์ด(useBoundStore)๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ค ์ ์ง๋ณด์ ์ง์ ์ด ํธํด์ง๋์?
โ ์ ๋ต: ๋จ์ผ ์คํ ์ด๋ก ๋ฌถ์ด๋๋ฉด Slice ์ํ ๊ฐ์ ๊ต์ฐจ ์ ๊ทผ ๋ฐ ์ํธ์์ฉ ๋ก์ง ์์ฑ์ด ํ ๊ณณ์์ ๊ฐ๋ฅํด์ง๋ฉฐ, ๋ ๋๋ง ์ต์ ํ๋ฅผ ์ํ ํ๋ฌ๊ทธ์ธ ๋ฑ ํ์ฅ์ด ์์ํด์ง๋ค.
๐ก ์์ธ ํด์ค:
- ์๋ฆฌ ์ค๋ช
: ์ฌ๋ฌ ๊ฐ์
create์คํ ์ด๋ฅผ ๋ง๋ค๋ฉด, "๋ก๊ทธ์์ ์ ๋คํฌ ๋ชจ๋๋ฅผ ์ด๊ธฐํํ๋ค" ๊ฐ์ ๋ก์ง์ ์ปดํฌ๋ํธ ๋ด์useEffect๋ก ๋์ง๋์ง ๋ฌถ๊ฑฐ๋ ์คํ ์ด ์ธ๋ถ ํ์ผ์์ ๊ฐ์ ํด์ผ ํ๋ ๋์ฐํ ํํธํ๊ฐ ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค. ๋ชจ๋ํ์ ์ฅ์ ์ ๊ฑฐ๋๋, ๋ฐ์ดํฐ๋ฅผ ์ง๋ฐฐํ๋ ์ค์ ์ผํฐ๋BoundStore๋ก ๋ฌถ์ด์ ์ํ ๊ฐ์ ํต์ ๊ณผ ๊ด๋ฆฌ ํฌ์ธํธ๋ฅผ ๊น๋ํ๊ฒ ๋จ๊ฒจ๋์ด์ผ ํฉ๋๋ค. - ์ค๋ต ํผ๋๋ฐฑ: "์์ฒ ๋, ์คํ ์ด๋ฅผ ์กฐ๊ฐ๋๋ค๊ณ ์์ ํ ๋จ๋จ์ด ๋ ๊ฒ ์๋์์.
StateCreator๋ฅผ ์ด์ฉํด ๋์จํ๊ฒ ๊ฒฐํฉํด์ฃผ๋ฉด,set๊ณผget๋ฉ์ปค๋์ฆ์ ๋์ผ์ ์์์ ์ฌ์ฉํ์ฌ ์ธ์ ๋ ์ฅ๋ฐ๊ตฌ๋๋ฅผ ๊ฑด๋ค ์ ์๋ต๋๋ค." - ๐ ํต์ฌ ๊ธฐ์ต๋ฒ: ๐ฆ ์ํธ: "์์ ํฑ๋๋ฐํด ์ฌ๋ฌ ๊ฐ๋ฅผ ๋ง๋๋ ๋ฐ ๊ทธ์น๋ฉด ๊ฐ์ ๋ฐ๋ก ๋๋๋ค. ํฑ๋๋ฅผ ๋๋ ๊น๋๋ผ๋ ํ๋์ ์๊ณํ(Bound Store) ์์ ์ฌ๋ ค์ผ ์ ํํ ์๋์ง๋ฅผ ๋ด๋ ๋ฒ์ด์ฃ ."
๐ฃ ์์ฒ ์ด์ ํด๊ทผ ์ผ๊ธฐ
์. ์ค๋ useBoundStore.ts ๋ง๋๋๋ฐ, ๊ทธ๋์ ์คํฌ๋กค ์๋ฐ์ด ์ฉ์๋ ์ฝ๋๊ฐ ๋ง๋ฒ๊ฐ์ด ๋ถ๋ฆฌ๋์๋ค! ์ฌ์ง์ด logout ํจ์์์ cartItems๊น์ง ์ง์๋ฒ๋ฆฌ๋๊น ๋น์ฆ๋์ค ๋ก์ง๋ค์ด ์คํฌํ ์ด ์์์ ์์๊ฒ ์ํตํ๋ ๊ธฐ๋ถ์ด ๋ค์๋ค. ์ญ์ ์ํธ ๋ฆฌ๋ ๋์ด ์ง๋ ์ํคํ
์ฒ๋ ๋ญ๊ฐ ๋ฌ๋ผ๋ ๋ค๋ฆ! ๋ด์ผ์ ํด๊ทผํ๊ณ ๋ชจ์ฒ๋ผ ์น๋งฅ ํ ์ ์์ํ๊ฒ ๊ฑธ์น๋ฉฐ, ์๋ก ๋ฆฌํฉํ ๋งํ ์ฝ๋๋ฅผ ํ๋ญํ๊ฒ ๊ฐ์ํด๋ด์ผ๊ฒ ๋ค ๐๐บ!
๐ก "์ํ๋ฅผ ์กฐ๊ฐ(Slice)์ฒ๋ผ ์๋ผ ๋๋๊ณ , ๋ฉ์ธ ์คํ ์ด๋ผ๋ ํ๋์ ๋ ๊ณ ํ์ ๋ผ์ ๋ง์ถ์."