description: "TanStack Query 사용 패턴 및 규칙" paths:
배열 형태, as const, 파일 상단에 상수로 선언
// ✅ good
const QUERY_KEYS = {
items: ["items"] as const,
itemDetail: (id: string) => ["items", id] as const,
};
// ❌ bad - 인라인 선언
useQuery({ queryKey: ["items"] })
| 데이터 성격 | staleTime |
|---|---|
| 자주 안 바뀌는 데이터 | 5 * 60 * 1000 (5분) |
| 실시간성 필요 | 0 |
| 클라이언트 전용 (localStorage 등) | Infinity |
export function useItems() {
return useQuery({
queryKey: QUERY_KEYS.items,
queryFn: fetchItems,
staleTime: 5 * 60 * 1000,
});
}
// 파생 데이터는 별도 훅으로 분리
export function useItemById(id: string) {
const { data: items = [] } = useItems();
return items.find((item) => item.id === id) ?? null;
}
export function useCreateItem() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: async (input: CreateItemInput) => {
return api.createItem(input);
},
onSuccess: () => {
// 관련 query만 정확히 invalidate
queryClient.invalidateQueries({ queryKey: QUERY_KEYS.items });
},
});
}
queryKey 인라인 문자열 직접 사용queryClient.clear() 남발아직 피드백이 없어요. 첫 번째로 의견을 남겨보세요!