[react-query] ์ข์์ ๊ธฐ๋ฅ ์ต์ ํํ๊ธฐ
์ข์์๋ ๋ง์ด ์ฌ์ฉ๋๋ ๊ธฐ๋ฅ์ด๊ธฐ ๋๋ฌธ์, ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํด ๋ก์ง์ ๋ถ๋ฆฌํ๋๊ฒ์ด ๋ ํจ์จ์ ์ด๋ผ๊ณ ํ๋จํ์ฌ ์ด์ ๋ํ ์์ ์ ์ํํ์๋ค.
๊ฒ์๊ธ๊ณผ ๋๊ธ, ๋๋๊ธ์ ์ข์์๊ฐ ๊ฐ๋ฅํ๋๋ก ๊ตฌํ๋์ด ์๊ณ , ์ข์์์ ๋ํ collection ๋ํ ๋ถ๋ฆฌํด๋๊ณ , post์ comment๋ likeCount ํ๋๋ฅผ ๊ฐ์ง๊ณ ์์ด์, ์ข์์๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์ฟผ๋ฆฌ๋ฅผ ํ์ง ์๋๋ก ํ์๋ค.
๐ DB collection ์ฐธ๊ณ
https://s-organization-335.gitbook.io/meongnang
Optimistic update
Optimistic update๋ ์๋ฒ์์ ๋ฐ์ดํฐ๊ฐ ์ ๋ฐ์ดํธ ๋๊ธฐ ์ ์ ์ฌ์ฉ์์๊ฒ ๋จผ์ ๋ณ๊ฒฝ๋ ๋ด์ฉ์ ๋ณด์ฌ์ฃผ๋ ๊ธฐ์ ๋ก ์ฌ์ฉ์ ui์์ ์ฆ์ ์๋ต์๋ณด์ฌ์ฃผ๊ณ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์๋ฒ๋ก ์์ฒญ์ ์ ์กํ๊ธฐ ๋๋ฌธ์, ๋น ๋ฅธ ์๋ต์ด ๊ฐ๋ฅํ๋ค.
๐๐ป ๋ง์ interaction์ด ๋ฐ์ํ๋ ์ข์์ ๊ธฐ๋ฅ์ optimistic update๋ฅผ ์ ์ฉ
๐๐ป ์ด์ ๋ณด๋ค ๋น ๋ฅธ ์๋ต ์๋๋ก ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํค๊ณ , ์ฌ์ฉ์๊ฐ ์ค๋ณต๋๋ ๊ฐ์ ์ก์ ์ ์ฌ๋ฌ๋ฒ ์๋ํ์ง ์๋๋ก ๋ฐฉ์งํ ์ ์๋ ์ฅ์ ๋ค์ ๊ฐ์ง์ ์๋ค.
export const useCreatePostLikeReaction = (postId: string, userId: string) => {
const queryClient = useQueryClient();
return useMutation({
mutationFn: () => createPostLikeReaction(postId, userId),
onMutate: async () => {
const previousLikeCount = queryClient.getQueryData([
POST_LIKE_COUNT,
postId,
]);
queryClient.setQueryData<number | undefined>(
[POST_LIKE_COUNT, postId],
(old) => (old ?? 0) + 1
);
return { previousLikeCount };
},
onError: (_err, _variables, context) => {
if (context?.previousLikeCount) {
queryClient.setQueryData(
[POST_LIKE_COUNT, postId],
context.previousLikeCount
);
}
},
onSettled: () => {
queryClient.invalidateQueries({
queryKey: [POST_LIKE_STATUS, postId, userId],
});
queryClient.invalidateQueries({ queryKey: [POST_LIKE_COUNT, postId] });
queryClient.invalidateQueries({ queryKey: [POST_LIKED_BY_USER, userId] });
},
});
};
๋ฉ์ธํ์ด์ง(์ ์ฒด ๊ฒ์๊ธ ํ์ธ๊ฐ๋ฅ)์์๋, ์ข์์๊ฐ ๊ฐ๋ฅํ๋๋ก ๊ตฌํํ๋ค๋ณด๋, ๋ฉ์ธ์์ ์ ์ฒด postCard๋ฅผ ๊ฐ์ ธ์ค๋ ์ฟผ๋ฆฌํค๋ [POST]๋ก ์ง์ ๋์ด์๊ณ , ๊ทธ๋ฌ๋ค๋ณด๋, ๋ฉ์ธํ์ด์ง์์ ์ข์์ ํ ๊ธ์ ํ ๋ post ๋ฐ์ดํฐ๋ฅผ ์ ๋ฐ์ดํธํด์ likeCount๋ฅผ ์ป์ผ๋ ค๊ณ ํ๋ค๋ฉด, ์์ธํ์ด์ง์์๋ [Post,PostId]๋ง invalidateํด๋๋์ง๋ง, ๋ฉ์ธํ์ด์ง์์ ์ข์์ ํ ๊ธ์ ํตํ ์ ๋ฐ์ดํธ๋ฅผ ์ํด์ [POST] invalidateํ๋ค๋ณด๋, ์ข์์ ํ ๊ธํ ๋๋ง๋ค ์คํฌ๋กคํ ์์ญ๊น์ง ๋ชจ๋ postCard๊ฐ ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํ๋ค….
๐๐ป likeCount API ๋ถ๋ฆฌ
postData์ likeCount๋ฅผ LikeToggleButton์ props๋ฅผ ๋ด๋ ค์ฃผ๋ ๋ฐฉ์์ด ์๋ post์ likeCountํ๋๊ฐ์ ์ป์ด์ค๋ getPostLikeCount๋ฅผ ๋ถ๋ฆฌํด์ฃผ์๋ค.
export const getPostLikeCount = async (postId: string) => {
const postRef = doc(db, "posts", postId);
const docSnap = await getDoc(postRef);
if (docSnap.exists()) {
const postData = docSnap.data() as postDto;
return postData.likeCount;
} else {
throw new Error("ํฌ์คํธ๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.");
}
};
๐๐ป ์ข์์ ๋ฒํผ๋ง ๋ฆฌ๋ ๋๋ง ๋ฐ์