Skip to content

πŸ”₯ λ“±λ‘λœ μ„ λ¬Ό μ‹€μ‹œκ°„ μ—…λ°μ΄νŠΈκ°€ μ•ˆ λ˜λŠ” 이슈

Jimin Yu edited this page Jun 21, 2024 · 2 revisions

문제 상황

  • μ„ λ¬Ό 등둝 μ™„λ£Œ ν›„ μ„ λ¬Ό 등둝 ν™ˆμœΌλ‘œ μ΄λ™ν–ˆμ„ λ•Œ μ•„μ΄ν…œμ΄ μžλ™ μ—…λ°μ΄νŠΈκ°€ λ˜μ§€ μ•ŠλŠ” 문제 λ°œμƒ(μ‚­μ œλŠ” 잘 반영됨)

문제 원인

  • μ„ λ¬Ό 등둝 ν™”λ©΄μ˜ 경우 이전에 쿼리에 μ €μž₯된 μ„ λ¬Ό 리슀트 정보가 남아 μžˆμ–΄ μƒˆλ‘œ μΆ”κ°€λœ μ„ λ¬Ό 리슀트λ₯Ό κ°±μ‹ ν•˜μ§€ μ•ŠλŠ” 상황
  • 이외에 λΆˆν•„μš”ν•œ 쿼리 ν‚€κ°€ μ—¬λŸΏ μ„€μ •λ˜μ–΄ μžˆμ—ˆμŒ

ν•΄κ²° 방법

λΆˆν•„μš”ν•˜κ²Œ μ„€μ •λ˜μ–΄ 있던 mutationKey κ°’ 제거 및 μˆ˜μ •λœ 데이터 μžλ™μœΌλ‘œ λ°˜μ˜λ˜λ„λ‘ μˆ˜μ •

mutationKeyλ₯Ό μ§€μ •ν•˜μ§€ μ•Šλ”λΌλ„ invalidateQueriesλ₯Ό ν™œμš©ν•˜λ©΄ νŠΉμ • 쿼리λ₯Ό λ¬΄νš¨ν™”ν•΄μ„œ ν•΄λ‹Ή 쿼리λ₯Ό λ‹€μ‹œ λΆ€λ₯Ό λ•Œ refetchκ°€ 이루어지도둝 μˆ˜μ •ν•  수 μžˆμ–΄, useMutate ν•¨μˆ˜μ— μ„€μ •λœ λΆˆν•„μš”ν•œ mutationKey듀을 λͺ¨λ‘ μ œκ±°ν–ˆμŠ΅λ‹ˆλ‹€.

invalidateQueries와 refetchQueries λͺ¨λ‘ μ‹€μ‹œκ°„ μ—…λ°μ΄νŠΈλ₯Ό μœ„ν•΄ μ‚¬μš©ν•  수 μžˆμœΌλ‚˜, λΆˆν•„μš”ν•œ λ„€νŠΈμ›Œν¬ ν˜ΈμΆœμ„ 쀄이기 μœ„ν•΄ invalidateQueries둜 κ²°μ •ν•˜μ˜€μŠ΅λ‹ˆλ‹€. refetchQueriesλŠ” ν˜ΈμΆœλ˜λŠ” μ¦‰μ‹œ refetchκ°€ μž‘λ™λ˜λŠ” 반면, invalidateQueriesλŠ” 쿼리 ν‚€ λ¬΄νš¨ν™”λ§Œ μš°μ„  μ§„ν–‰ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. λ‹€λ§Œ invalidateQueries μ‚¬μš© μ‹œ λ¬΄νš¨ν™”ν•  쿼리에 λŒ€ν•œ 쿼리킀λ₯Ό 지정할 λ•Œ, μš”μ†Œκ°€ λ‹€λ₯΄λ©΄ μ œλŒ€λ‘œ 반영이 μ•ˆ λ˜λ―€λ‘œ 꼼꼼히 체크해야 ν•©λ‹ˆλ‹€!

μ„ λ¬Όν™ˆ, μ„ λ¬Όλ°© νŽΈμ§‘μ— μ“°μ΄λŠ” delete κ΄€λ ¨ μ„œλ²„ 톡신 μ½”λ“œλ₯Ό λͺ¨λ‘ 같은 λ°©μ‹μœΌλ‘œ μˆ˜μ •ν–ˆμŠ΅λ‹ˆλ‹€.

// useDeleteMyGift.tsx 일뢀
export function useDeleteMyGift(roomId: number) {
  const queryClient = useQueryClient();

  const mutation = useMutation({
    mutationFn: deleteMyGift,
    onSuccess() {
      console.log('μ„ λ¬Ό μ‚­μ œ 성곡');
// 이 λ•Œ μ“°μ΄λŠ” 쿼리 ν‚€λŠ” 'λ‚΄κ°€ λ“±λ‘ν•œ μ„ λ¬Ό 리슀트'λ₯Ό GET ν•΄μ˜€λŠ” ν•¨μˆ˜μ—μ„œ 지정해쀀 쿼리 킀와 λ™μΌν•˜κ²Œ μ§€μ •ν•΄μ£Όμ–΄μ„œ
// ν•΄λ‹Ή 쿼리에 λŒ€ν•œ λ¬΄νš¨ν™”κ°€ μ§„ν–‰λ˜λ„λ‘ ν•©λ‹ˆλ‹€.
      queryClient.invalidateQueries({ queryKey: [MY_GIFT_QUERY_KEY[0], roomId] });
    },
    onError: (error) => {
      console.log('μ„ λ¬Ό μ‚­μ œ 쀑 μ—λŸ¬κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.', error.message);
    },
  });
// useDeleteRoomMember.tsx
export const deleteRoomMember = async ({ roomId, memberId }: DeleteRoomMember) => {
  await del(`/room/${roomId}/members/${memberId}`);
};

const useDeleteRoomMember = ({ roomId }: DeleteRoomMember) => {
  const queryClient = useQueryClient();
  const mutation = useMutation({
    mutationFn: deleteRoomMember,
    onSuccess() {
      console.log('μ‚­μ œ 성곡');
// μ—¬κΈ°μ—μ„œλ„ μ„ λ¬Όλ°© μ°Έμ—¬ 멀버 리슀트λ₯Ό GET ν•΄μ˜€λŠ” 쿼리λ₯Ό λ¬΄νš¨ν™”ν•˜κΈ° μœ„ν•΄ 쿼리킀λ₯Ό μ•„λž˜μ™€ 같이 μ„€μ •ν•©λ‹ˆλ‹€.
      queryClient.invalidateQueries({ queryKey: [...ROOM_MEMBER_QUERY_KEY, roomId] });
    },
    onError: (error) => {
      console.log('μ„ λ¬Ό μ‚­μ œ 쀑 μ—λŸ¬κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.', error.message);
    },
  });
  return { mutation };
};

πŸ“Έ μŠ€ν¬λ¦°μƒ·

⬇️ λ‚΄κ°€ λ“±λ‘ν•œ μ„ λ¬Ό μˆ˜μ •λœ ν™”λ©΄

Screen.Recording.2024-02-10.at.8.30.36.PM.mov

κ΄€λ ¨ PR

[μ„ λ¬Ό 등둝, μ„ λ¬Όλ°© νŽΈμ§‘] λ¦¬μ•‘νŠΈ 쿼리 κ΄€λ ¨ 데이터 μ‹€μ‹œκ°„ μ—…λ°μ΄νŠΈ 문제 ν•΄κ²°

Clone this wiki locally