작성
·
66
0
댓글, 재게시 기능 개발시 onSuccess 메서드 사용 부분에서 궁금한 점이 생겨 질문 드립니다.
로직은 비슷해서 재게시 로직 첨부했습니다!!
좋아요 기능과 마찬가지로 optimistic update 방식으로 보다 빠른 UI 변경을 보기 위해 사용하는건지 궁금합니다.
강의를 수강하다가 onMutate, onSuccess 메서드에서 optimistic update 방식이 혼재 되있어 댓글, 재게시 기능들은 onSuccess 함수에 invalidateQueries 메서드를 활용해 쿼리 상태를 최신으로 다시 가져오는 방식은 괜찮지 않을까, 또 제로초님 의견은 어떠신지 궁금점이 들어 질문 드립니다!!
async onSuccess(response) {
const newPost = await response.json();
setContent("");
setPreview([]);
const queryCache = queryClient.getQueryCache();
const queryKeys = queryCache.getAll().map((cache) => cache.queryKey);
queryKeys.forEach((queryKey) => {
if (queryKey[0] === "posts") {
const value: Post | InfiniteData<Post[]> | undefined =
queryClient.getQueryData(queryKey);
if (value && "pages" in value) {
const obj = value.pages
.flat()
.find((v) => v.postId === parent?.postId);
if (obj) {
// 존재는 하는지
const pageIndex = value.pages.findIndex((page) =>
page.includes(obj)
);
const index = value.pages[pageIndex].findIndex(
(v) => v.postId === parent?.postId
);
const shallow = { ...value };
value.pages = { ...value.pages };
value.pages[pageIndex] = [...value.pages[pageIndex]];
shallow.pages[pageIndex][index] = {
...shallow.pages[pageIndex][index],
Comments: [{ userId: me?.user?.email as string }],
_count: {
...shallow.pages[pageIndex][index]._count,
Comments: shallow.pages[pageIndex][index]._count.Comments + 1,
},
};
shallow.pages[0].unshift(newPost); // 새 답글 추가
queryClient.setQueryData(queryKey, shallow);
}
} else if (value) {
// 싱글 포스트인 경우
if (value.postId === parent?.postId) {
const shallow = {
...value,
Comments: [{ userId: me?.user?.email as string }],
_count: {
...value._count,
Comments: value._count.Comments + 1,
},
};
queryClient.setQueryData(queryKey, shallow);
}
}
}
});
await queryClient.invalidateQueries({
queryKey: ["trends"],
});
// or
async onSuccess() {
console.log(queryClient.getQueryCache().getAll());
await Promise.all([
queryClient.invalidateQueries({
queryKey: ["posts", String(post?.postId)],
}),
queryClient.invalidateQueries({
queryKey: ["posts", String(post?.postId), "comments"],
}),
]);
},
},
답변 2
0
0
안녕하세요, 인프런 AI 인턴입니다.
천하무적박정권님께서 질문하신 내용은 React Query의 onMutate
, onSuccess
메서드를 사용한 댓글 및 재게시 로직에 대한 것으로, 주로 optimistic update
와 데이터를 최신 상태로 유지하기 위한 invalidateQueries
의 사용에 관한 고민으로 보입니다.
onMutate
vs onSuccess
onMutate
: 이 메서드는 비동기 작업이 시작되기 전에 호출되며, 주로 optimistic update
를 적용하기에 적합합니다. 사용자에게 즉각적인 피드백을 주고자 할 때 사용됩니다. 작업이 실패하면, onError
를 통해 롤백 작업을 할 수 있도록 하는 구조입니다.
onSuccess
: 비동기 작업이 성공적으로 완료된 후 호출되며, 서버에서 변경된 최신 데이터를 받아와 상태를 갱신할 수 있습니다. 이 때 invalidateQueries
를 활용하여 관련된 쿼리들을 무효화하고 새로운 데이터를 가져오도록 할 수 있습니다.
optimistic update
의 목적optimistic update
는 사용자 경험을 향상시키기 위해, 서버의 응답을 받기 전에 UI를 즉시 업데이트하는 방식입니다. 주로 onMutate
를 사용하지만, 이후 정확한 데이터를 얻기 위하여 onSuccess
에서 invalidateQueries
를 통해 최종적인 검증을 합니다.
onSuccess
에서 invalidateQueries
를 통해 데이터를 최신화하는 것이 보편적입니다. 이렇게 하면 서버에서 반환된 최종 결과를 바탕으로 데이터 상태를 즉시 갱신할 수 있습니다.optimistic update
사용 시 주의: 만약 성능 문제나 사용자 경험상의 이점이 없다면 optimistic update
는 과도한 복잡성을 초래할 수 있으니, 필요성을 재고하실 필요가 있습니다.강의의 맥락과 관련된 유사한 질문으로는 다음이 있습니다:
이 자료들에서는 invalidateQueries
의 사용 방법 및 onMutate
와 onSuccess
의 차이점에 대해 다룹니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.