React Query 개념과 활용법
React Query는 React 애플리케이션에서 서버 상태 관리를 간편하고 효율적으로 처리할 수 있게 해주는 라이브러리입니다. 서버 데이터를 가져오고, 캐싱하고, 동기화하며, 업데이트할 때 강력한 기능을 제공합니다.
useQuery() Hook
`useQuery()`는 데이터를 가져오는데 사용됩니다. 컴포넌트가 마운트되면 `queryFn`에 정의된 함수가 자동으로 실행되어 데이터를 가져옵니다.
const { data, isLoading, isError } = useQuery({
	queryKey: ['posts', username],
	queryFn: () => getPostsByUsername(username),
	staleTime: 60 * 1000, // 60초 동안 fresh 상태 유지
})- queryKey
 - 데이터를 캐싱할 때 사용됩니다.
 - `[’posts’, username]`처럼 배열 형태로 특정 데이터를 구분해 관리할 수 있습니다.
- queryFn
 - 데이터를 가져오는 함수입니다. 주로 백엔드 API 호출을 처리합니다.
- staleTime
 - 데이터가 fresh 상태를 유지하는 시간을 설정합니다.
 - 이 시간 내에 동일한 데이터를 요청하면 데이터 요청 없이 캐시 데이터를 반환합니다.
로딩 및 에러 처리
`useQuery`의 반환 값을 활용하여 로딩 상태와 에러 상태를 간편하게 처리할 수 있습니다.
const {
	data: postsData,
	isLoading,
	isError,
} = useQuery({
	queryKey: ['posts'],
	queryFn: fetchPosts,
});
if (isLoading) return '로딩 중입니다...';
if (isError) return '에러가 발생했습니다.';
return <PostList posts={postsData} />;
useMutation() Hook
useMutation()은 데이터를 추가, 수정, 삭제하는 작업에서 사용됩니다.
const uploadPostMutation = useMutation({
  mutationFn: (newPost) => uploadPost(newPost),
  onSuccess: () => {
    queryClient.invalidateQueries({ queryKey: ['posts'] });
  },
});
const handleUploadPost = (newPost) => {
  uploadPostMutation.mutate(newPost, {
    onSuccess: () => {
      toast('포스트가 성공적으로 업로드되었습니다!');
    },
  });
};
- mutationFn
 - 데이터를 추가하거나 수정, 삭제할 때 호출되는 함수입니다.
- mutate() 함수
 - useMutation() Hook은 데이터를 직접 변경하지 않으므로, 데이터를 변경하려면 mutate()를 호출해야 합니다.
- onSuccess
 - 요청 성공 시 실행됩니다.
 - 예를 들어, queryClient.invalidateQueries()를 사용해 특정 데이터를 다시 가져오도록 설정할 수 있습니다.
- onError
 - 요청 실패 시 실행됩니다.
- onSettled
 - 요청 성공 또는 실패 여부에 관계없이 항상 실행됩니다.