2026-01-29
Zustand
Zustand란?
React를 위한 가볍고 직관적인 전역 상태 관리 라이브러리
- 전역 상태를 관리
- 간단하고 성능이 좋음
- 보일러플레이트가 거의 없다
⇒ 전역 상태가 필요한데 Redux까지는 과하다 할 때 사용
특징
- 아주 가볍다 (bundle size 작음)
- Context Provider 필요 없음
- Hook 기반 API
- 불필요한 리렌더링 최소화
- 비동기 로직 처리 쉬움
기본 사용 구조
-
store 생성
import { create }from'zustand'; const useStore =create((set) => ({ count:0, increase:() =>set((state) => ({count: state.count +1 })), }));create로 store를 정의- 상태 + 상태 변경 함수(action)를 한 곳에 작성
-
컴포넌트에서 사용
const count =useStore((state) => state.count); const increase =useStore((state) => state.increase);- 필요한 상태만 선택적으로 구독
- 선택한 값이 바뀔 때만 리렌더링 → 성능 좋음
다른 상태관리와 비교
-
Zustand vs Context API
⇒ Context의 리렌더링 문제를 깔끔하게 해결
항목 Context API Zustand 사용성 설정 번거로움 매우 간단 Provider 필요 불필요 리렌더링 범위 큼 필요한 컴포넌트만 규모 소규모 중·대규모도 가능 -
Zustand vs Redux
⇒ Redux의 복잡함 없이 전역 상태 관리
항목 Redux Zustand 보일러플레이트 많음 거의 없음 러닝커브 높음 낮음 미들웨어 필수적 선택적 비동기 처리 thunk/saga 그냥 함수로 처리
비동기 로직 처리
Zustand는 비동기 전용 도구가 필요 없다
const useStore =create((set) => ({
user:null,
fetchUser:async () => {
const res =awaitfetch('/api/user');
const data =await res.json();
set({user: data });
},
}));
- action 안에서
async/await바로 사용 - 실무에서 API 상태 관리에 편함
상태 분리 & 구조화
const useAuthStore =create((set) => ({
accessToken:null,
login:(token) =>set({accessToken: token }),
logout:() =>set({accessToken:null }),
}));
도메인별 store 분리 (auth, user, ui, modal 등)
이런 상황에 쓰면 좋다
- 로그인 정보 / 유저 정보
- 모달 열림 여부
- 필터, 정렬 상태
- 여러 페이지에서 공유되는 UI 상태
- SPA 전역 상태 관리
참고자료
- https://mi-dairy.tistory.com/entry/React-Zustand%EC%93%B0%EB%A9%B4-Redux-%EC%9D%B4%EC%A0%9C-%EB%AA%BB-%EC%94%80-Zustand-%ED%8C%8C%ED%97%A4%EC%B9%98%EA%B8%B0
- https://www.heropy.dev/p/n74Tgc
- https://hyunki99.tistory.com/111
- https://velog.io/@hyejeong/Zustand-%EC%83%81%ED%83%9C%EA%B4%80%EB%A6%AC-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0
- https://ldd6cr-adness.tistory.com/entry/Zustand-Flux-%ED%8C%A8%ED%84%B4%EC%9D%98-%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C-%EC%83%81%ED%83%9C-%EA%B4%80%EB%A6%AC-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC