React Query의 uesMutation을 쓸 때 마다 key는 왜 제공되는거지? 의문이었는데 최근에 그 이유를 찾았다. 제목처럼 useMutationState 에서 사용하는데, 이 함수를 사용해서 전역에서 내가 원하는 mutation의 상태를 조회할 수 있다.
공식 문서에 따르면 v5 버전부터 제공하고 MutationCache의 Mutation에 접근할 수 있는 Hook이라고 한다. 원하는 Mutation에 접근할 수 있도록 필터링을 제공한다.
그렇다면 MutationCache는 무엇이고 useMutation은 왜 MutationCache에 있는것일까?
실행된 mutation 인스턴스를 보관한다. QueryClient 객체 생성시 같이 생성된다. mutation의 default 설정을 지정할 수 있다.
useMutation이 반환하는 객체는 mutation을 실행하긴하지만 상태의 주체는 MutationCache이다. 실제 실행은 MutationCache가 보관중인 Mutation 인스턴스이다. useMutation이 반환한 객체는 그저 그 상태를 구독하는 Observer일 뿐이다.
정리하자면, useMutation이 반환한 객체를 통해 mutate() 또는 mutationAsync()로 실행을 하면 MutationCache에 새로운 Mutation 인스턴스가 생성되고 useMutationCache로 조회를 할 수 있게된다.
실행된 mutation은 useMutation 정의 시 지정한 gcTime(구 버전에서는 cacheTime) 후에 제거된다.
// createUserMutation.ts
return useMutation({
mutationKey: ['createUser'],
mutationFn: async (newUser) => {
//...
},
gcTime : 5000, // mutation 실행이 완료되어 결과가 반환된 시점부터 5초 후 MutationCache에서 제거
});
// PendingUserList.tsx
function PendingUserList() {
// MutationCache에서 'createUser' 키를 가진 pending 상태의 mutation 상태 가져오기
const pendingUserNames = useMutationState({
filters: { mutationKey: ['createUser'], status: 'pending' },
select: (mutation) => mutation.state.variables.name,
});
if (pendingUserNames.length === 0) return null;
return (
<div className="status-panel">
<h4>유저 생성 중...</h4>
<ul>
{pendingUserNames.map((name, index) => (
<li key={index}>{name} 님의 정보를 등록하고 있습니다.</li>
))}
</ul>
</div>
);
}
uesMutation 정말 오랜만에 봤더니 기억이 안나고 있음을 깨달음과 동시에 잠들어있던 기억이 깨어나네요 ㅋ.ㅋ
생각해보니 그 때 당시 저는 의문을 갖지 않고 그냥 하라는 데로만 했었던거 같습니다!ㅋㅋㅋ
useMutationState은 처음 보는거 같네요! mutation 한 내용을 확인할 수 있는 줄은 몰랐습니다!
지금 이 포스팅 글을 읽고 나니 MutationCache와 uesMutation, useMutationState의 관계가 머리 속에 그려지네요!ㅋㅋ
gcTime이 궁금해서 찾아보니 구 React Query의 v3, v4 에서의 cacheTime 이였네요!?
Tanstack Query v5 에서는 이름만 gcTime 으로 바뀌었군여..!ㅎ 기본값은 5분!!
사용해보지 않아서 잘 모르겠지만!?!
왠지 useMutationState 로 데이터를 조회할 상황이
저는 머릿속에서 잘 안 그려져서 그런지..!? 많을 것 같지 않아 보입니다!
만약 사용해야 한다면, gcTime 수정은 반드시 필요해 보이기도 하네요?!! 맞는지 모르겠습니다!ㅎㅎ