Web Development/JAVASCRIPT
์ํ๊ด๋ฆฌ [3ํธ] - Zustand์ ์ ์ฐํจ์ด ๋๊ท๋ชจ ํ๋ก์ ํธ์์ ์ด๋ ค์ด ์ด์
devflate
2025. 3. 22. 12:55
๐ Zustand๋ ์ Flux ์ํคํ ์ฒ๊ฐ ์๋๊น?
- Action์ด๋ผ๋ ๊ฐ๋ ์ด ํ์ ์๋
- Dispatcher๊ฐ ์์
- ์ํ ๋ณ๊ฒฝ ํ๋ฆ์ ์๊ฒฉํ ์ ์ดํ์ง ์์
- set()์ผ๋ก ์ธ์ ๋ ์ง ์ํ ๋ณ๊ฒฝ ๊ฐ๋ฅ
โ๏ธ Zustand์ set() vs Redux์ dispatch()
๋น์ | Redux (dispatch) | Zustand (set) |
---|---|---|
์ญํ | ๋น์์๊ฒ ๋ฉ๋ชจ ์ ๋ฌ | ์ง์ ์์ฒฉ์ ์์ฑ |
์ ์ด ํ๋ฆ | ๊ฐ์ ์ (Action → Reducer) | ์ง์ ์ํ ๋ณ๊ฒฝ |
๋๋ฒ๊น | ์ก์ ๋ก๊ทธ ์ถ์ ๊ฐ๋ฅ | ์ถ์ ์ด๋ ค์ (์๋ ๋ก๊น ํ์) |
๐ง Zustand๊ฐ ๋ํ ํ๋ก์ ํธ์์ ์ด๋ ค์ด ์ด์
1. ์ํคํ ์ฒ์ ๊ตฌ์กฐ ๊ฐ์ ๊ฐ ์๋ค
- Redux๋ ๊ตฌ์กฐ ๊ฐ์ → ํ์ ์ ์ ๋ฆฌ
- Zustand๋ ์์ ๋ก์ด ๋งํผ ์ค๊ณ ์ผ๊ด์ฑ ๋ถ์กฑ
2. ์ํ ๋ณ๊ฒฝ ์ถ์ ์ด๋ ค์
- Redux: DevTool๋ก ์ํ/์ก์ ์ถ์ ๊ฐ๋ฅ
- Zustand: ์๋ ๋ก๊ทธ๋ ๋ฏธ๋ค์จ์ด ํ์
3. ๋น๋๊ธฐ ํ๋ฆ์ด ํ์คํ๋์ง ์์
- Redux: thunk, saga, RTK Query ๋ฑ ๋ค์ํ ๋ฐฉ์ ์ ๊ณต
- Zustand: ๋ฏธ๋ค์จ์ด ๊ธฐ๋ฅ ์ ํ์ , ์ปค์คํ ์ค๊ณ ํ์
4. ์ํ ๋ถ๋ฆฌ/๋ชจ๋ํ์ ์ด๋ ค์
Redux๋ slice๋ก ๋๋ฉ์ธ ๋ถ๋ฆฌ ๊ฐ๋ฅ, Zustand๋ ๋จ์ผ store ๋ฐฉ์ ๊ธฐ๋ณธ
5. ํ๋ฒ์ ์ฌ๋ฌ Store๋ฅผ ์กฐ์ํ๋ ๋ฐฉ์
Redux๋ extraReducers๋ฅผ ์ฌ์ฉํด์, ๊ฐ๊ฐ์ store ๋ด๋ถ์ state๋ฅผ ํธํ๊ฒ ์กฐ์ํ ์ ์๋ค.
// Redux ์์
// userSlice.ts
extraReducers: (builder) => {
builder.addCase('LOGOUT', () => ({ name: '', token: null }));
};
// postSlice.ts
extraReducers: (builder) => {
builder.addCase('LOGOUT', () => ({ posts: [] }));
};
Zustand๋ Redux์ฒ๋ผ ํ๋ฒ์ ์ฌ๋ฌ store๋ฅผ ์กฐ์ํ ์ ์๋ ๋ฐฉ๋ฒ์ด ํ์ ์ ์ด๊ธฐ ๋๋ฌธ์, ์ธ๋ถ ๋ก์ง ๋ด์ store ์กฐ์ ์ฝ๋๋ฅผ ๋ฃ์ด์ ๊ด๋ฆฌํ ์ ์๋ค. ( => ์ฝ๋๊ฐ ๋ถ์ฐ๋๊ธฐ ๋๋ฌธ์ Redux์ ๋นํด ์ฝ๋๋ฅผ ํ์ ํ๋ ๋ฐ ์ด๋ ค์์ด ์๋ค.)
// ์ํ์ set์ ๊ฐ๊ฐ์ store๋ก ๋ถ๋ฆฌ
// stores/userStore.ts
export const useUserStore = create(set => ({
user: null,
setUser: (user) => set({ user }),
}));
// stores/settingsStore.ts
export const useSettingsStore = create(set => ({
darkMode: false,
setDarkMode: (val) => set({ darkMode: val }),
}));
// usecases/login.ts
export const login = async (email, pw) => {
const res = await api.login(email, pw);
useUserStore.getState().setUser(res.user);
useSettingsStore.getState().setDarkMode(res.user.prefersDarkMode);
};
๐ ์ด๋ ๊ฒ ํ๋ฉด store๋ ์ํ๋ง ๊ด๋ฆฌํ๊ณ , ๋ณต์กํ ํ๋ฆ์ ์ธ๋ถ usecase์์ ๊ด๋ฆฌ ๊ฐ๋ฅ!
โ
๊ฒฐ๋ก
๊ตฌ๋ถ | Redux | Zustand |
---|---|---|
์ฒ ํ | ๊ตฌ์กฐํ๋ ์ํ ํ๋ฆ | ์์ ๋กญ๊ณ ์ ์ฐํ ์ํ |
์ฅ์ | ๋๋ฒ๊น , ์์ธก ๊ฐ๋ฅ์ฑ | ๋ณด์ผ๋ฌํ๋ ์ดํธ ์์, ๋น ๋ฅธ ๊ฐ๋ฐ |
๋จ์ | ์ฝ๋๊ฐ ๋ณต์กํ๊ณ ๋ง์ | ๊ตฌ์กฐ์ ํต์ผ์ฑ ๋ถ์กฑ, ์ถ์ ์ด๋ ค์ |
์ถ์ฒ | ๋๊ท๋ชจ ํ์ ํ๋ก์ ํธ | ์์ ๊ท๋ชจ, ๋น ๋ฅธ ๊ฐ๋ฐ |