data-fetching
スター11
フォーク0
更新日2026年3月2日 14:18
TanStack Query 기반 데이터 페칭 패턴
インストール
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SKILL.md
readonlyメニュー
TanStack Query 기반 데이터 페칭 패턴
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
Prowl 앱을 격리 환경에서 실행하고 UI 동작을 E2E 검증. 작업 완료 후 회귀 확인용.
에이전트 간 상호작용 구조와 워크플로우 정의
컨벤션에 맞춰 커밋 생성
PR 템플릿에 맞춰 Pull Request 생성
Prowl 앱의 디자인 시스템 (Liquid Glass + 골드 액센트)
IPC 채널 추가/수정 시 안전 규칙과 절차
| name | data-fetching |
| description | TanStack Query 기반 데이터 페칭 패턴 |
| user-invocable | false |
TanStack Query (@tanstack/react-query)를 사용한 데이터 페칭 규칙.
src/renderer/
├── queries/
│ ├── client.ts # QueryClient 인스턴스 (staleTime: 30s)
│ └── keys.ts # 쿼리 키 팩토리
└── hooks/
├── useLaunchdJobs.ts # useQuery 예시
├── useJobActions.ts # useMutation 예시
├── useSettings.ts # 공유 상태 예시
├── useFocusMode.ts # optimistic update 예시
└── useCalendarData.ts # 복합 훅 예시
src/renderer/queries/keys.ts에 정의된 팩토리 사용:
queryKeys.jobs.list() // ["jobs", "list"]
queryKeys.calendar.events() // ["calendar", "events"]
queryKeys.settings.get() // ["settings", "get"]
새 쿼리 추가 시 반드시 keys.ts에 키 정의.
const { data: jobs = [], isLoading, error } = useQuery({
queryKey: queryKeys.jobs.list(),
queryFn: () => window.electronAPI.listJobs(),
refetchInterval: JOB_POLLING_INTERVAL_MS, // 폴링 (선택)
});
running job이 있을 때만 빠르게 폴링:
refetchInterval: (query) =>
(query.state.data?.length ?? 0) > 0 ? 1000 : false,
const mutation = useMutation({
mutationFn: (settings: AppSettings) =>
window.electronAPI.setSettings(settings),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: queryKeys.settings.all });
},
});
const mutation = useMutation({
mutationFn: (event: LocalEvent) => window.electronAPI.addLocalEvent(event),
onMutate: async (event) => {
await queryClient.cancelQueries({ queryKey: queryKeys.calendar.events() });
const previous = queryClient.getQueryData(queryKeys.calendar.events());
queryClient.setQueryData(queryKeys.calendar.events(), (old = []) =>
[...old, toCalendarEvent(event)],
);
return { previous };
},
onError: (_err, _vars, context) => {
if (context?.previous)
queryClient.setQueryData(queryKeys.calendar.events(), context.previous);
},
onSettled: () => {
queryClient.invalidateQueries({ queryKey: queryKeys.calendar.events() });
},
});
window.electronAPI 직접 호출 금지 — 반드시 hooks 사용invalidateQueries 필수onMutate + onError + onSettled 세트queries/keys.ts에 키 팩토리 추가window.electronAPI.onWindowShow 이벤트 시 invalidateQueries로 새로고침