패스트캠퍼스 데브캠프

토이 3 프로젝트 작성한 코드 복기 (6) - tanstack-query 사용

vitamin3000 2025. 1. 19. 21:45

 

지난 포스트인 https://vitamin3000.tistory.com/171에서 supabase에 접근하는 api 함수를 만들었다.

 

이번 포스트에서는 이 함수와 tanstack-query를 사용하여 서버 상태관리하는 방법에 대해 알아보고자 한다.

 

1. tanstack라이브러리 제공 함수와 만든 관련 api 함수를 import 한다

import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
import { fetchCategories, deleteCategories } from '@/api/categories';
import { toastError, toastSuccess } from '@/utils/toast';

2. hook/useCategories.ts

hook으로 제작하기 때문에 앞에 use가 붙는다

const useCategories = (userId: string) => {
  const queryClient = useQueryClient();

  const categoriesQuery = useQuery({
    queryKey: ['categories', userId],
    queryFn: () => fetchCategories(userId),
    select: data =>
      data.map(category => ({
        ...category,
        updated_at: new Date(category.updated_at),
      })),
    enabled: !!userId,
  });

  const deleteCategoriesQuery = useMutation({
    mutationFn: (categoryId: string) => deleteCategories(categoryId),
    onSuccess: () => {
      toastSuccess('해당 카테고리가 삭제되었어요!');
      queryClient.invalidateQueries({ queryKey: ['categories'] });
    },
    onError: (error: Error) => {
      console.error('업로드 실패:', error);
      toastError('오류가 발생헜어요 ! 다시 시도해주세요');
    },
  });

  return {
    categoriesQuery,
    deleteCategoriesQuery,
  };
};

export { useCategories };

 

여기서 주의할 점은 queryKey는 중복되지 않는 값을 가져야하는 것이다.

그 이유는 tanstack-query에서 캐싱을 할 때 관련 queryKey를 참조하여 데이터를 비교 후에 값을 변경할지 말지를 결정하기 때문이다.

 

3. 필요한 컴포넌트에서 사용할 때는 fetchCategoires같은 api 보다 hook을 사용한다.

Hook을 사용하면 로딩 상태와 오류를 쉽게 관리할 수 있기 때문이다.