데이터를 관리하는 store를 설계할 때는 도메인/기능 단위로 나누는 것이 좋다
각각의 API마다 store를 만들기보다는, 연관된 데이터와 기능을 하나의 store로 그룹화하는 것을 추천
현재 프로젝트 기준으로
도메인 기반 분리:
유저 관련 데이터는 userStore
투표 관련 데이터는 votingStore
각 도메인별로 관련 데이터와 액션을 그룹화
상태 표준화:
모든 API 응답 데이터는 동일한 구조 (data, isLoading, error)
상태 관리 일관성 유지
로딩/에러 상태 쉽게 처리 가능
React Query와 Zustand를 함께 사용하는 것은 매우 좋은 방법이다
각각의 장점을 활용하여 더 효율적인 상태 관리가 가능하다
명확한 관심사 분리:
React Query: 서버 데이터 관리 (투표 이벤트, 결과 등)
Zustand: 클라이언트 상태 관리 (인증 정보, UI 상태 등)
효율적인 캐싱과 상태 관리:
React Query의 자동 캐싱으로 불필요한 API 호출 감소
Zustand의 간단한 상태 업데이트로 UI 반응성 향상
타입 안전성:
TypeScript를 통한 엄격한 타입 체크
API 응답 타입 정의로 런타임 에러 방지
최적화된 성능:
React Query의 staleTime, cacheTime 최적화
Zustand의 선택적 구독으로 불필요한 리렌더링 방지
개발 편의성:
React Query Devtools로 캐시 상태 모니터링
중앙화된 API 클라이언트 설정
재사용 가능한 커스텀 훅
import { QueryClient } from '@tanstack/react-query'
export const queryClient = new QueryClient({
defaultOptions: {
queries: {
staleTime: 60 * 1000, // 1 minute
cacheTime: 60 * 60 * 1000, // 1 hour
refetchOnWindowFocus: false,
retry: 1
},
mutations: {
retry: 1
}
}
})