Query Keys

기본적으로 리액트 쿼리는 쿼리의 고유한 key를 바탕으로 해당 쿼리에 대한 캐싱을 관리한다.


리액트 쿼리 공식 문서를 읽고 번역 및 정리한 내용입니다 :)
1편은 아래 링크를 참고해주세요!
React Query(리액트 쿼리)를 사용해보자: Queries


쿼리 키는 단순히 문자열을 포함하는 배열에서부터, 중첩 객체를 가지는 배열이 될 수도 있다.
쿼리 키가 고유하고, 직렬화가능한 한 사용할 수 있다.

단순한 쿼리 키

주로 리스트나, 인덱스 리소스, 위계가 없는 리소스에 대해서는 쿼리 키를 이렇게 작성한다.

// A list of todos
useQuery({ queryKey: ['todos'], ... })

// Something else, whatever!
useQuery({ queryKey: ['something', 'special'], ... })


변수가 있는 배열 키 (조금 더 복잡한 쿼리 키)

쿼리 키에 쿼리의 데이터를 설명하기 위한 추가 정보를 전달할 수도 있다.

  • 항목을 고유하게 식별하기 위해 ID, 인덱스 또는 기타 프리미티브를 전달하거나,
  • 추가적인 파라미터를 전달하기 위해 위와 같은 형태로 쿼리 키를 작성한다.
// An individual todo
useQuery({ queryKey: ['todo', 5], ... })

// An individual todo in a "preview" format
useQuery({ queryKey: ['todo', 5, { preview: true }], ...})

// A list of todos that are "done"
useQuery({ queryKey: ['todos', { type: 'done' }], ... })


쿼리 키는 결과적으로 해시된다.

즉, 객체 안의 키의 순서가 어떻든지 모두 동일한 것으로 간주된다.

useQuery({ queryKey: ['todos', { status, page }], ... })
useQuery({ queryKey: ['todos', { page, status }], ...})
useQuery({ queryKey: ['todos', { page, status, other: undefined }], ... })


하지만, ‘배열’일 경우 인덱스의 순서가 중요하므로 다음 예시에서는 쿼리 키가 동등하게 간주되지 않는다.

useQuery({ queryKey: ['todos', status, page], ... })
useQuery({ queryKey: ['todos', page, status], ...})
useQuery({ queryKey: ['todos', undefined, page, status], ...})


쿼리 함수가 변수에 의존한다면 쿼리 키에 변수를 포함한다

쿼리 키는 가져오는 데이터를 고유하게 설명하는 용도로 사용되므로 쿼리 함수를 변경하는 어떤 변수든지 쿼리 키에 포함되어야 한다.

function Todos({ todoId }) {
  const result = useQuery({
    queryKey: ['todos', todoId],
    queryFn: () => fetchTodoById(todoId),
  })
}

댓글남기기