태그
목차

병렬 쿼리

생성일: 2024-03-22

수정일: 2024-03-22

'병렬' 쿼리는 fetch 동시성(concurrency)을 최대화하기 위해 병렬로 또는 동시에 실행되는 쿼리다.

수동 병렬 쿼리

병렬 쿼리의 수가 일정한 경우, 병렬 쿼리를 사용하기 위해 추가적인 노력을 기울일 필요가 없다. Tanstack Query의 useQueryuseInfiniteQuery 훅을 나란히 몇 개든 사용하기만 하면 된다!

function App () {
  // 다음 쿼리들은 병렬로 실행된다.
  const usersQuery = useQuery({ queryKey: ['users'], queryFn: fetchUsers })
  const teamsQuery = useQuery({ queryKey: ['teams'], queryFn: fetchTeams })
  const projectsQuery = useQuery({ queryKey: ['projects'], queryFn: fetchProjects })
  ...
}

Note

서스펜스 모드에서 React Query를 사용하는 경우, 첫 번째 쿼리가 내부적으로 프로미스를 던지고 다른 쿼리가 실행되기 전에 컴포넌트를 일시 중단하기 때문에 이러한 병렬 처리 패턴이 작동하지 않는다. 이 문제를 해결하려면 (권장되는) useSuspenseQueries 훅을 사용하거나 각 useSuspenseQuery 인스턴스에 대해 별도의 컴포넌트를 사용하여 자체적으로 오케스트레이션해야 한다.

useQueries를 사용한 동적 병렬 쿼리

실행해야 하는 쿼리 수가 동적으로 변경되는 경우 수동 쿼리를 사용하면 훅 규칙을 위반하게 되어 사용할 수 없다. 대신, TanStack Query는 원하는 만큼의 쿼리를 동적으로 병렬로 실행하는 데 사용할 수 있는 useQueries 훅을 제공한다.

useQueries 함수는 queries 속성이 있는 옵션 객체를 받으며 queries 의 값은 쿼리 객체 배열이다.

useQeuries 함수는 쿼리 결과 배열을 반환한다.

function App({ users }) {
  const userQueries = useQueries({
    queries: users.map((user) => {
      return {
        queryKey: ['user', user.id],
        queryFn: () => fetchUserById(user.id),
      };
    }),
  });
}