최근에 했던 프로젝트에 리액트 쿼리를 활용하려고 했으나 흐지부지 쓰지 못했던게 아쉬워서 다음 프로젝트에서는 제대로 사용하려고 공부하기 위한 리액트 쿼리 정리이다.
Mutation은 데이터를 가져오는 Query와 달리 데이터를 생성, 업데이트, 삭제하거나 서버의 사이드이펙트를 수행하는데 사용된다.
Mutation호출을 실행할 때 서버에서 받는 데이터를 취하고 업데이트 된 해당 데이터로 react-query 캐시를 업데이트 한다.
또한 Mutation은 최적화를 위해 쿼리 데이터를 무효화하거나 갱신할 수 있다.
useMutation은 일부 예외를 제외하고 useQuery훅과 매우 유사하다.
Mutation을 사용하려면 useMutation훅을 사용해야 한다.
mutate함수를 반환하는데 우리가 변경 사항을 토대로 서버를 호출할 때 사용할 것이다.
데이터를 저장하지 않으므로 쿼리 키가 필요하지 않다.
Query와 비슷한 isPending은 존재하지만 isFetching>은 없다. 캐시된 항목이 없으므로 isFetching은 성립하지 않는다.
변이에 관련된 캐시는 존재하지 않고 리페칭 또한 기본값으로 존재하지 않는다. 다만, 데이터를 최신화하기 위해서 자동 리페칭을 적용하고 싶다면 설정해 주는 것은 가능하다.
react-query version3 에서는 isLoading이였지만 version5에서는 isPending으로 변경되었다.
mutationFn: (variables: TVariables) => Promise<TData>
onSuccess: (data: TData, variables: TVariables, context: TContext) => void
onMutate: (variables: TVariables) => Promise<TContext | void> | TContext | void
onError: (err: TError, variables: TVariables, context?: TContext) => Promise<unknown> | void
onSettled: (data: TData, error: TError, variables: TVariables, context?: TContext) => Promise<unknown> | void
이 외에도 다양한 옵션들이 존재한다.
mutate
mutate: (variables: TVariables, { onSuccess, onSettled, onError }) => void
mutate를 호출해서 Mutation을 실행시킬 수 있다.
variables는 mutationFn에 전달하는 객체이다.
onSuccess, onSettled, onError는 useMutation Options에 설명한 것과 동일하다.
useMutation은 쿼리 키와 관련 있는 캐시 내부의 데이터와는 상관없다.
위 로직은 useMutation을 사용해서 Delete API요청을 보내는 로직이다.
먼저 useMutation을 사용하기 위해서는 해당 훅을 사용하려는 컴포넌트 혹은 커스텀훅을 사용한다면 해당 커스텀훅 파일 내에 import해줘야 한다.
import { useMutation } from "@tanstack/react-query"
그 후, useMutation을 선언한 파일 내부에 useMutation을 정의해준다.
정의한 useMutation훅 내부에 mutationFn을 사용하기 위해서 내부에 단일 객체를 생성하고 mutationFn키를 생성해준다.
react-query version3 에서는 mutationFn자체를 인수로 줄 수 있었지만 version5에서는 단일 객체에 키 : 값으로 구성해야 한다.
mutationFn은 익명함수로 값을 가지고 있고 해당 익명함수의 매개변수로는 useMutation에서 반환한 mutate로 전달한 인수가 들어올 수 있다.
즉, 위와같이 코드를 작성하면 "deleteMutation.mutate(post.id)"에 있는 "post.id"값이 useMutation훅의 인수로 전달이 되어져서 결국 mutationFn의 "postId"값이 mutate메서드의 인수로 들어간 "post.id"값이 된다.
isPending
해당 변이함수가 완료될때까지를 알 수 있는 플래그 변수이다.
변이 함수가 진행중이라면 true를 반환한다.
isSuccess
해당 변이 함수가 완료될 때 알 수 있는 플래그 변수이다.
변이함수가 완료 된다면 true값을 반환한다.
isError
해당 변이함수에 에러를 알 수 있는 플래그 변수이다.
변이함수에 에러가 있거나 해당 요청이 실패한다면 true값을 반환한다.
onError
mutation이 실패했을 때 실행되는 콜백 함수이다.
주로 mutation이 실패한 경우에 수행해야 할 작업을 정의할 때 사용된다.
예를 들어, 콘솔에 에러를 로깅하거나 사용자에게 실패 메세지를 보여주는 등의 작업을 수행할 수 있다.
비동기 작업에서 예외처리에 해당하는 역할을 해준다.
크게 보면 둘의 차이점은 각각이 나타내는 시점이라고 보면 된다.
onError은 에러가 발생하면 즉시 실행되며 비동기 작업의 실패에 대한 처리를 담당한다.
isError는 현재 mutation이 에러 상태인지 여부를 확인하여 UI에서 해당 상태에 따른 처리를 수행한다.