inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

한 입 크기로 잘라먹는 React.js 실전 프로젝트 - SNS 편

(4.10) 캐시 데이터 다루기 4 - 낙관적 업데이트 (2)

캐시 데이터 다루기 - 낙관적 업데이트(2)에서 질문

74

유니크한 늑대

작성한 질문수 2

0

createTodo의 리턴값을 활용하면서

Todo를 생성했을 때, 캐시 무효화를 해서 데이터가 많은 경우 서버에 부하를 주는 코드를 개선했었었는데,

 

낙관적 업데이트2에서 데이터의 무결성을 위해 onSettled에서

queryClient.invalidateQueries

를 호출했는데 여기서는 괜찮은 걸까요?

react typescript react-query supabase zustand

답변 2

0

이정환 Winterlood

안녕하세요 김재홍님 이정환입니다.

우선 질문을 제가 제대로 이해했는지부터 확인해보겠습니다.

"createTodo의 리턴값을 활용하면서 Todo를 생성했을 때, 캐시 무효화를 해서 데이터가 많은 경우 서버에 부하를 주는 코드를 개선했었었는데"

위 질문은 useCreateTodoMutation의 onSuccess 이벤트 핸들러에서 발생한 일을 말씀하신게 맞을까요?

추가로 invalidateQueries 함수를 호출한 onSettled가 useUpdateTodoMutation의 이벤트 핸들러를 말씀하시는 걸까요?

 

위 두개가 맞다면 네, 말씀하신 방향이 맞습니다. useUpdateTodoMutation처럼 체크박스 토글처럼 “특정 Todo 하나만 바뀌는” 상황에서는 전체 리스트 캐시(QUERY_KEYS.todo.list)를 매번 invalidateQueries로 날려서 다시 받아오는 것보다, 지금 코드처럼 해당 Todo의 캐시만 딱 집어서 수정(setQueryData) 해주는 방식이 훨씬 효율적입니다. 네트워크 요청도 줄고, 데이터가 많아질수록 성능/UX 측면에서 이점이 커집니다.

다만 지금 단계에서는 데이터가 완전히 “정규화”되어 있지 않다 보니, 리스트 캐시와 개별 캐시를 동시에 깔끔하게 유지하려면 조금 불편한 지점이 생길 수 있습니다. 그래서 강의에서는 우선 토글처럼 단순한 케이스는 “부분 업데이트”로 처리하고, 이후에 정규화 전략으로 캐시를 더 안정적으로 관리하는 방식을 다루게 됩니다. 정규화 전략은 4.12, 4.13 챕터에서 다루니 뒷 내용까지 수강하시면 좋을 것 같습니다.

1

유니크한 늑대

안녕하세요, 답변 감사합니다.

 

맨 처음 useCreateTodoMutation에 대한 코드를 작성했을 때,
onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["todos"], }); },

이 방식을 했었는데 캐시 무효화를 하면 서버에 부담이 갈 수 있다고 해서 [...prevTodos, newTodo] 방식으로 코드를 개선했었습니다.
그런데 useUpdateTodoMutationonSettled에서 동일한 코드를 작성하는 방식이어서 동일하게 서버에 부담이 가는 방식인데 왜 했을까에 대한 의문이 들어서 질문을 드렸었습니다.

 

답변 주신 것처럼 캐시 데이터 정규화 부분을 보니, 더 좋은 방법에 대해 알 수 있었습니다.

단지, 4.10 챕터까지에서의 관점에서 더 나은 방법이 있는지에 대한 궁금증이 있어서 질문을 드렸습니다. (제가 질문을 드릴 때 상세하게 작성을 못했던 것 같습니다)

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. 김재홍님
질문하신 내용은 낙관적 업데이트 후 데이터 무결성을 유지하기 위한 처리에 대한 것입니다.

캐시 무효화와 서버 부하

queryClient.invalidateQueries는 모든 관련 캐시를 무효화하고, 서버에서 다시 데이터를 받아와 업데이트를 수행합니다. 데이터 무결성을 보장하기 위해 매우 중요한 작업입니다. 하지만 데이터를 많이 다뤄야 하는 경우 서버 부하가 증가할 수 있습니다.

개선을 위한 대안

낙관적 업데이트에서는 두 가지 옵션을 고려할 수 있습니다:

  1. 로컬 데이터 업데이트:

    • 낙관적으로 업데이트된 데이터를 캐시에 반영하여, 서버 요청 횟수를 줄일 수 있습니다. 업데이트된 데이터를 사용해 setQueryData를 활용하여 명시적으로 캐시를 갱신하는 방법이 있습니다.
  2. 배치 처리:

    • 여러 데이터의 변화를 한번에 처리할 수 있도록 백엔드에서 배치 업데이트를 구성할 수 있습니다. 이는 서버로의 요청 횟수를 줄여 성능 향상에 도움이 됩니다.

관련하여 유사한 주제를 다룬 강의 질문이 있습니다. 아래 링크를 참고하시어 좀 더 구체적인 해결책을 찾을 수 있을 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.

현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

useMutation 적용 후 새로운 글 등록시 content가 안보여요

0

32

2

6.8 zustand 세션 질문입니다.

0

74

2

next.js 강의에서도 리액트 라이브러리들을 다뤄주시나요?

0

60

2

shadcn에서 radix ui와 base ui 차이는 뭔가요?

0

215

2

updateTodo 함수 생성시 화살표 함수 사용 안하는 이유

0

63

2

4.11 바로 투두 삭제가 안됨 질문

0

75

3

매개변수 updatedTodo 관련 질문

0

57

3

인증 정보가 만료되었을 때 라우트 가드 처리가 궁금합니다!

0

73

2

supabase를 사용하지 않을 경우 세션 데이터의 변경을 감지하고 스토어에 보관하는 방법이 궁금합니다!

0

60

2

4.6 id를 string으로 변경시 오류

0

55

2

리액트 타입스크립트 관련 질문있습니다.

0

54

1

소셜 로그인 구현하기 관련하여 질문이 있습니다!

0

88

2

ui 파일 질문드립니다.

0

65

1

tanstack query devtools에서 질문있습니다!

0

58

2

댓글 삭제 시 isPending 질문

0

56

2

두번째 예외상황에 대해 질문있습니다!

0

56

1

리액트 쿼리 질문입니다

0

57

2

개발자도구에서 components 가 안보입니다.

0

81

3

state 관리에 대한 정리

0

70

3

[(2.4) Shadcn/ui를 소개합니다] 강의 Shadcn 세팅 관련 질문 있습니다.

0

150

3

like 테이블에서 왜 create_at이 필요한지 궁금합니다.

0

67

1

삭제가 바로 안되네요ㅠ

0

56

2

access 토큰은 꼭 소셜서버로부터 받아서 사용해야만하나요?!

0

72

2

전역 모달이 여러 개일 경우 모달 프로바이더는 몇 개가 필요한가요?

0

56

1