🇺🇸 English · 🇰🇷 한국어
React Query Helper는 TypeScript API 함수로부터 React Query 훅과 옵션 객체를 자동 생성해 주는 CLI 도구입니다. 설정만 해두면 반복적인 훅 작성 시간을 절약하고 프로젝트 전체에 걸쳐 일관된 데이터 패칭 규칙을 유지할 수 있습니다.
- 설정 기반 자동화:
rqh.config.ts만 구성하면 API 디렉토리 감지부터 출력 디렉토리 지정까지 모두 자동화됩니다. - Watch & Generate 모드: 개발 중 실시간 감시(
--watch), 초기 세팅이나 재생성 시 일괄 생성(--generate)을 모두 지원합니다. - 일관된 옵션 관리:
queryOption,mutationOption,infiniteOption유틸리티로 전역 캐싱 전략과 에러 핸들링을 통일할 수 있습니다. - Prettier 통합: 생성된 파일은 자동으로 포맷팅되어 코드 리뷰 시 불필요한 변경을 줄입니다.
- 템플릿 확장성: 기본 템플릿 대신 사용자 정의 템플릿을 지정해 조직의 코딩 규칙을 쉽게 반영할 수 있습니다.
bun add @uiwwsw/react-query-helper
# 또는
npm install --save-dev @uiwwsw/react-query-helper루트에 rqh.config.ts 파일을 생성하고 다음과 같이 채워주세요.
// rqh.config.ts
import type { AutoQueryConfig } from "./src/config";
const config: AutoQueryConfig = {
sourceDir: "./libs", // API 함수들이 위치한 경로
outputDir: "./src/options", // 생성된 코드가 저장될 경로
// ignoredFiles: ["types.ts"],
// templateDir: "./custom-templates",
};
export default config;package.json에 스크립트를 추가한 뒤 CLI를 실행하면 됩니다.
bun run watch # 실시간 변경 감지
bun run generate # 전체 파일 일괄 생성| 명령어 | 설명 |
|---|---|
react-query-helper --watch |
sourceDir를 감시하여 변경될 때마다 코드를 갱신합니다. |
react-query-helper --generate |
sourceDir 내 모든 API 파일을 분석하고 한 번에 코드를 생성합니다. |
react-query-helper --help |
사용 가능한 모든 옵션을 확인합니다. |
| 옵션 | 필수 | 설명 |
|---|---|---|
sourceDir |
✅ | API 함수가 포함된 TypeScript 디렉토리 (루트 기준 경로) |
outputDir |
✅ | 생성된 훅과 옵션 파일이 저장될 디렉토리 |
ignoredFiles |
❌ | 코드 생성에서 제외할 파일 이름 배열 |
templateDir |
❌ | 사용자 정의 템플릿이 위치한 디렉토리 |
// libs/users/api.ts
export const getUser = async (id: string) => {
return { id, name: `User ${id}` };
};
export const createUser = async (name: string) => {
return { id: Date.now().toString(), name };
};// src/options/users/apiOptions.ts (자동 생성)
import { createUser, getUser } from "../../../libs/users/api";
import {
infiniteOption,
mutationOption,
queryOption,
} from "@uiwwsw/react-query-helper";
export const getUserKey = ["users", "getUser"] as const;
export const getUserQueryOption = queryOption(getUserKey, getUser);
export const getUserMutationOption = mutationOption(getUserKey, getUser);
export const getUserInfiniteQueryOption = infiniteOption(getUserKey, getUser);
export const createUserKey = ["users", "createUser"] as const;
export const createUserQueryOption = queryOption(createUserKey, createUser);
export const createUserMutationOption = mutationOption(createUserKey, createUser);
export const createUserInfiniteQueryOption = infiniteOption(
createUserKey,
createUser
);조직 맞춤 코딩 스타일이 필요하다면 템플릿 디렉토리를 지정하세요.
const config: AutoQueryConfig = {
sourceDir: "./libs",
outputDir: "./src/options",
templateDir: "./custom-templates", // EJS 템플릿 디렉토리
};템플릿 파일에서 React Query 옵션, 에러 핸들링, import 경로 등을 마음껏 수정할 수 있습니다. 변경 사항은 다음 실행 시 바로 반영됩니다.
- 하나의 API = 하나의 훅 구조를 유지하면 캐시 키 관리가 쉬워집니다.
- 생성된 파일은 버전 관리 시스템(Git)에 커밋하여 배포 시 자동 생성 과정을 피하세요.
queryOption유틸 함수에서 글로벌 옵션(staleTime,retry,refetchOnWindowFocus)을 정의하면 팀 전체 규칙을 손쉽게 통일할 수 있습니다.- Watch 모드 사용 시 IDE 저장 포맷터와 충돌이 없도록 저장 시점 포맷팅을 맞춰 주세요.
버그 제보, 기능 제안, 문서 개선 등 모든 기여를 환영합니다. 이슈를 등록하거나 Pull Request를 보내 주세요.
이 프로젝트는 MIT 라이선스를 따릅니다.