본문 바로가기
React

TanstackQuery-기본사용법

by rinny01 2025. 3. 18.
반응형

💡주요기능

- 데이터 캐싱

: 캐싱 ? 서버에게 데이터를 요청했을때, 서버입장에서는 요청받은 데이터를 매번 찾는게 아니라, 자주 찾는 데이터를 메모리에 저장해두고 빠르게 결과물을 클라이언트에게 전달한다. 

 

- 자동 리페칭

: 리페칭 : 다시 데이터를 가져온다

데이터가 변경 되었을때 자동으로 리페칭하여 최신상태를 유지한다.

 

- 쿼리 무효화

: 특정 이벤트 발생시 쿼리를 무효화 하고 다시 데이터를 가져올수 있다.

 

서버상태를 가져오고 관리하는 세가지 과정

1. get: useQurey

데이터를 가져온다 (READ)

2. modify: useMutation

데이터를 생성, 업데이트, 삭제 한다 (CREATE, UPDATE, DELETE)

3. refresh : invalidateQueries

무효화 시킨다. 왜?

가져왔던 결과물이 useMutation 으로 변경되었을 경우, 새로 갱신시켜주어야 하기 때문에

 

세팅하기

당연히 설치 해주어야 한다..ㅎ

yarn add @tanstack/react-query

 

1. QueryClientProvider 로 App을 감싼다

  • QueryClientProvider하위 컴포넌트는 모두 영향을 받는다(App전체)
  • client : 텐스텍 쿼리의 주요 기능을 사용할수 있는 인스턴스 > new QueryClient 로 클라이언트를 생성해준다
// main.jsx

import ReactDOM from "react-dom/client";
import App from "./App.jsx";
import "./index.css";
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";

const queryClient = new QueryClient();

ReactDOM.createRoot(document.getElementById("root")).render(
  <QueryClientProvider client={queryClient}>
    <App />
  </QueryClientProvider>
);

 

useQuery (데이터 가져오기)

1. {data,isPending,isError} = useQuery()

  • useQuery()가 반환하는 결과물은 data,isPending,isError 가 있다.
  • 이 훅을 통해 서버에서 데이터를 가져오고, 가져온 데이터를 컴포넌트에서 쉽게 사용할 수 있다.

2. 그런데 유즈쿼리를 사용할때 2개의 인자를 객체안에 넣어주어야 한다.  

  • queryKey : ["키이름"] , // 쿼리키 : 배열형태
  • queryFn : () => {} // 쿼리펑션 : 함수
useQuery({
  queryKey : [] , // 쿼리키 : 배열형태
  queryFn : () => {} // 쿼리펑션 : 함수
})
더보기

전체코드

import { useQuery } from "@tanstack/react-query";
import axios from "axios";

const App = () => {
  const fetchTodos = async () => {
    const response = await axios.get("http://localhost:4000/todos");
    return response.data;
  };

  const {data: todos, isPending, isError} = useQuery({
    queryKey: ["todos"],
    queryFn: fetchTodos,
  });

  if (isPending) {
    return <div>로딩중입니다...</div>;
  }

  if (isError) {
    return <div>데이터 조회 중 오류가 발생했습니다.</div>;
  }

  return (
    <div>
      <h3>TanStack Query</h3>
      <ul>
        {todos.map((todo) => {
          return (
            <li key={todo.id}>
              <h4>{todo.title}</h4>
              <p>{todo.isDone ? "Done" : "Not Done"}</p>
            </li>
          );
        })}
      </ul>
    </div>
  );
};

export default App;

 

 

useMutation(데이터 생성,수정,삭제)

1.  mutation 객체 생성

2. mutationFn 엮어주기

const mutation = useMutation({
	mutationFn : addTodo,
});

 

3. mutation 사용하기

<form onSubmit={(e) => {
  e.preventDefault();
  const newTodoObj = { title: todoItem, isDone: false };

  // useMutation 로직
  mutation.mutate({title:todoItem, isDone : false})

}}
>

 

구조분해 할당을 적용해서 사용해도 된다.

더보기

전체코드

import { useMutation, useQuery } from "@tanstack/react-query";
import axios from "axios";
import { useState } from "react";

const App = () => {
  const [todoItem, setTodoItem] = useState("");

  const fetchTodos = async () => {
    const response = await axios.get("http://localhost:4000/todos");
    return response.data;
  };

  const addTodo = async (newTodo) => {
    await axios.post("http://localhost:4000/todos", newTodo);
  };

  const {
    data: todos,
    isPending,
    isError,
  } = useQuery({
    queryKey: ["todos"],
    queryFn: fetchTodos,
  });

  const { mutate } = useMutation({
    mutationFn: addTodo,
  });

  if (isPending) {
    return <div>로딩중입니다...</div>;
  }

  if (isError) {
    return <div>데이터 조회 중 오류가 발생했습니다.</div>;
  }

  return (
    <div>
      <h3>TanStack Query</h3>
      <form
        onSubmit={(e) => {
          e.preventDefault();

          const newTodoObj = { title: todoItem, isDone: false };

          // useMutation 로직
          mutation.mutate()
          
        }}
      >
        <input
          type="text"
          value={todoItem}
          onChange={(e) => setTodoItem(e.target.value)}
        />
        <button>추가</button>
      </form>
      <ul>
        {todos.map((todo) => {
          return (
            <li
              key={todo.id}
              style={{
                display: "flex",
                alignItems: "center",
                gap: "10px",
                backgroundColor: "aliceblue",
              }}
            >
              <h4>{todo.title}</h4>
              <p>{todo.isDone ? "Done" : "Not Done"}</p>
            </li>
          );
        })}
      </ul>
    </div>
  );
};

export default App;

 

invalidateQueries

쿼리를 무효화하여 데이터를 다시 패칭해주어야 하기 때문에 , useMutation과 함께 사용하여 데이터가 변경된후 해당 쿼리를 다시 가져온다.

const queryClient = useQueryClient();
  const { mutate } = useMutation({
    mutationFn: addTodo,
    onSuccess : () => {
    	queryClient.invalidateQueries(["todos"]);
    }
  });
반응형
LIST

'React' 카테고리의 다른 글

Redux의 구성  (0) 2025.03.09
타입스크립트를 시작해보자  (1) 2025.03.06
Tanstack Query  (0) 2025.02.24
React 조건부 렌더링을 활용한 로그인/회원가입 폼 리팩토링  (0) 2025.02.21
useContext 왜쓰는데?  (3) 2025.02.06