[React] useQuery에서 queryKey의 역할은 무엇일까?

2025. 3. 7. 14:41·Front-end/React

개요

오늘 Tanstack Query로 리팩토링하는 타임어택을 하다가 오류를 하나 해결하지 못하고 제출했었다.

동기분에게 도움을 요청했었는데 바로 문제를 찾아주셨다👍🏻

 

문제는 `useQuery`에서 queryKey를 설정하는 곳에서 발생했었다.

queryKey의 역할을 명확하게 이해하고 있지 못하는 것 같아 queryKey에 대해 글을 정리해보려고 한다.

 

 

queryKey는 무엇일까?

queryKey를 기반으로 쿼리 캐싱을 관리함

 

queryKey의 특징

· queryKey는 반드시 배열 안에 있어야 한다.

· query에 대한 추가적인 정보가 필요하면 해당 내용을 string key 뒤에 넣어주면 된다.

⭐️ 같은 queryKey를 가진 요청은 동일한 데이터를 공유한다.

 

 

내가 겪은 문제 상황과 원인

💻 기존의 useTodoDetailQuery.js 코드

import { useQuery } from "@tanstack/react-query";
import { fetchDetail } from "../api/todos";

export const useTodoDetailQuery = (id) => {
  return useQuery({
    queryKey: ["todos"],
    queryFn: () => fetchDetail(id),
  });
};

 

💻 기존의 useTodosQuery.js 코드

import { useQuery } from "@tanstack/react-query";
import { fetchData } from "../api/todos";

export const useTodosQuery = () => {
  return useQuery({
    queryKey: ["todos"],
    queryFn: fetchData,
  });
};

 

TodoList를 보여주는 페이지에 있다가 TodoDetail 페이지로 넘어갈 때는 문제가 없다.

그런데 TodoDetail 페이지에서 TodoList를 보여주는 페이지로 넘어오면 에러가 발생한다.

 

문제의 원인을 살펴본 결과,

TodoDetail 페이지에서 TodoList를 보여주는 페이지로 넘어올 때

TodoList에서 map을 돌릴 때 사용하는 todos가 객체로 콘솔에 찍히는 것을 확인했다.

 

🧐 그렇다면 왜 배열이었던 todos가 객체로 넘어오게 되는 것일까?

 

위에 작성한 useQuery 훅 코드를 살펴보면 알 수 있다.

queryKey: ["todos"]

queryKey를 설정할 때 동일한 key를 공유하는 것을 확인할 수 있다.

동일한 key를 공유하고 있기 때문에 데이터 또한 같은 데이터를 공유하게 된다.

 

✅ TodoDetail 페이지에서 TodoList를 보여주는 페이지로 넘어올 때, 같은 queryKey로 같은 데이터를 공유하고 있기 때문에 todos가 객체가 되는 것이었다. 좀 더 자세하게 말하면, 같은 queryKey를 공유하고 있기 때문에 detail에서 사용한 todo의 데이터가 기존의 todos의 데이터를 덮어쓰게 된다.

 

그렇다면 해당 문제를 어떻게 해결할까?

 

 

해결 방법

해결방법은 굉장히 간단하다.

 

💻 수정된 useTodoDetailQuery.js 코드

import { useQuery } from "@tanstack/react-query";
import { fetchDetail } from "../api/todos";

export const useTodoDetailQuery = (id) => {
  return useQuery({
    queryKey: ["todos", id],
    queryFn: () => fetchDetail(id),
  });
};

✅ queryKey를 설정할 때, 가져오려는 데이터의 테이블 이름과 id를 함께 적어주면 된다.

id값을 포함하여 개별 todo의 상세 데이터를 캐싱하게 된다.

 

그러면 다음과 같이 페이지를 이동해도 에러가 발생하지 않는다!

 


[참고자료]

https://tanstack.com/query/latest/docs/framework/react/guides/query-keys

https://velog.io/@rgfdds98/React-Query-queryKeys

 

 

반응형
저작자표시 비영리 변경금지 (새창열림)

'Front-end > React' 카테고리의 다른 글

[React] React의 렌더링 과정 깊숙이 이해하기  (3) 2025.06.02
[아웃소싱 프로젝트] - Tanstack Query를 이용해서 북마크 기능 구현하기 feat.supabase  (0) 2025.03.05
[MBTI 테스트] - Tanstack Query에서 Optimistic Updates 적용하기  (0) 2025.02.25
[MBTI 테스트] - 카카오톡 공유하기 기능 만들기  (1) 2025.02.24
[React] json-server란 무엇일까?  (0) 2025.02.24
'Front-end/React' 카테고리의 다른 글
  • [React] React의 렌더링 과정 깊숙이 이해하기
  • [아웃소싱 프로젝트] - Tanstack Query를 이용해서 북마크 기능 구현하기 feat.supabase
  • [MBTI 테스트] - Tanstack Query에서 Optimistic Updates 적용하기
  • [MBTI 테스트] - 카카오톡 공유하기 기능 만들기
집으로 감자
집으로 감자
Hello World
  • 집으로 감자
    Potato to Home
    집으로 감자
  • 전체
    오늘
    어제
  • 링크

    • Github
    • 분류 전체보기
      • Front-end
        • TIL
        • Javascript
        • Typescript
        • React
        • Next.js
        • CSS
        • 라이브러리
      • Algorithm
        • 프로그래머스: 기초 트레이닝
        • 프로그래머스 LV1
      • TroubleShooting
      • Problem & Solution
      • Project
      • Programing Knowledge
        • 개발 용어
        • CS
        • 운영체제
        • 자료구조
        • 데이터 베이스
  • 태그

    Til
    프로그래머스
    styledcomponent
    문제해결
    반응형웹
    CSS
    개발용어
    JavaScript
    실행컨텍스트
    코딩테스트
    회고
    트러블슈팅
    tanstackquery
    react
    http
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
집으로 감자
[React] useQuery에서 queryKey의 역할은 무엇일까?
상단으로

티스토리툴바