개발/저장소
쿼리 구조화
LeeHyoGeun
2024. 10. 19. 18:38
현재 코드와 React Query의 queryOptions 접근 방식 비교:
현재 코드:
- 서비스 함수로 API 호출 로직을 분리
- 각 함수는 특정 API 엔드포인트에 대한 호출 담당
- 에러 처리가 각 함수 내에서 이루어짐
queryOptions 접근 방식:
- 쿼리 키, 쿼리 함수, 기타 옵션들을 하나의 객체로 묶음
- React Query의 훅들과 직접적으로 사용하기 쉬움
- TypeScript와 함께 사용할 때 타입 안전성이 더 강화됨
queryOptions를 사용한 코드 예시:
import { queryOptions } from '@tanstack/react-query'
import { api } from "../util/api";
export const eventQueries = {
all: () => queryOptions({
queryKey: ['events'],
queryFn: async () => {
const response = await api.get<EventsResponse>("/events");
return response.events;
},
}),
detail: (id: string) => queryOptions({
queryKey: ['events', id],
queryFn: async () => {
const response = await api.get<EventResponse>(`/events/${id}`);
return response.event;
},
}),
// 다른 쿼리들도 비슷한 방식으로 정의할 수 있습니다.
}
export const eventMutations = {
add: () => ({
mutationFn: (event: addEventRequest) =>
api.post<addEventResponse, addEventRequest>("/events", { body: event }),
}),
update: (id: string) => ({
mutationFn: (event: addEventRequest) =>
api.patch<addEventResponse, addEventRequest>(`/events/${id}`, { body: event }),
}),
delete: () => ({
mutationFn: (id: string) =>
api.delete<eventDeleteResponse, eventDeleteRequest>(`/events/${id}`),
}),
}
이점:
- 쿼리와 뮤테이션 로직이 중앙화되어 관리가 쉬워짐
- React Query 훅들과 함께 사용하기 쉬워짐 (예: useQuery(eventQueries.all()))
- TypeScript와 함께 사용할 때 타입 안전성이 향상됨
- 쿼리 키와 함수가 함께 정의되어 있어 일관성을 유지하기 쉬움
결론:
현재 코드도 충분히 잘 구조화되어 있으며, 프로젝트의 요구사항과 팀의 선호도에 따라 현재 방식을 유지해도 무방함. queryOptions 방식으로의 전환은 타입 안전성과 React Query와의 통합을 더 강화하고자 할 때 고려할 수 있음.