Optimistic Updates - react-query .feat(infinite queries)

2023. 6. 4. 20:33·카테고리 없음

optimistic update란 번역대로 낙관적인 업데이트이다.

사용자 입장에서 어떤 인터랙션을 통해서 변화가 일어날 것이라는 예측이 된다면 이 방법을 사용해보는 것도 괜찮을 것 같다.

예로 사용자가 인스타그램의 게시물에 하트를 누르면 하트가 빨간하트가 되고 다시 누르면 하트가 빈 하트가 될 것이라는 예측이 된다.

이를 통해 현재 진행하고 있던 쇼핑몰 프로젝트에서 상품에 대한 하트 누르기 및 하트 취소하기 기능을 적용하면서

 react query에서 제공하는 optimistic update를 사용하기로 하였다.

 

 

 

 

하트를 누를 시의 optimistic update 코드

const {mutate: addLike} = useMutation((data: number) => apis.Product.addLike(data),
  {
    onMutate: async(variable) => {
      await queryClient.cancelQueries({queryKey: ['getProducts']})
      const previous = queryClient.getQueryData(['getProducts']);

      queryClient.setQueryData<InfiniteData<Array<any>>>(['getProducts'], (old:any) => {
        const newData = old?.pages.map((page:any) => 
          page.map((value:any) => {
            if(value.id === variable){
              return {
                ...value,
                Likers: [...value.Likers, {id: me?.id}]
              }
            }else{
              return value
            }
          })
          )

          return {
            ...old,
            pages:newData
          }
      })
      return { previous }
    },
    
    onError: (err: any, param, context) => {
      if(err.response.status = 401){
        router.push('/signin')
      }else{
        queryClient.setQueryData(['getProducts'], context?.previous)
      }
    },
    onSettled: () => {
      queryClient.invalidateQueries({queryKey: ['getProducts']})
    }
  });

 

onMutate

onMutate란 addLike라는 mutate가 실행되기 전에 실행되는 함수이다.

addLike라는 mutate가 실행되기 전에 cancelQueries['getProducts']로 상품들의 목록을 가져오는 usequery를 막는다.

이를 수행하는 이유는 optimistic update를 통해 데이터를 수정할때 데이터가 overwrite되는 현상을 막기 위해서 이다.

 

const previous = queryClient.getQueryData(['getProducts'])를 통해 수정하기 이전 값을 스냅샷 한다.

 

setQueryData를 통해서 상품목록을 가져오는 query 데이터를 수정해야한다.

즉 프론트 단에서 낙관적 업데이트가 적용된 데이터로 탈바꿈하는 것이다.

상단 코드 같은 경우에는 infinite queries를 사용하기 때문에 조금 다르다.

old라는 파라미터는 객체 형태이고 pageParams와 pages의 형태로 구성되어 있다.

실제적인 데이터는 pages 배열의 각 value 값에 해당된다.

이 previous라는 데이터를 기준으로 Likers 배열에 나의 id를 넣는 로직을 작성하여 

pages 배열 값을 수정한 값을 업데이트 시켜준다.

끝으로 return {previous} 를 통해 이전 값을 리턴해준다.

 

onError

이 값은 onError시에 사용 될 수 있다. context.previous를 통해서 가져와서 사용할 수 있으며 

만약 에러가 발생한다면 다시 이전 값으로 롤백 시키기 위함이라고 생각하면 된다.

 

 

onSettled

onSettled는 성공 유무에 상관없이 실행할 로직을 의미한다.

낙관적 업데이트가 성공했든 실패했든 서버의 최신 상태를 반영해야하므로 invalidateQueries를 통해

마지막으로 목록을 최신화 시킨다.

 

저작자표시 비영리 (새창열림)
king_hd
king_hd
웹 개발 공부를 위한 블로그입니다.
웹 개발 기록웹 개발 공부를 위한 블로그입니다.
king_hd
웹 개발 기록
king_hd
전체
오늘
어제
  • 분류 전체보기
    • HTML
    • CSS
    • JS
    • Typescript
    • React
    • nodejs
    • Redux
    • Git
    • 오류모음
    • Webpack
    • 자료구조
    • 네트워크
    • Electron
    • 배포
    • Docker
    • 프로그래머스

블로그 메뉴

  • 홈

링크

공지사항

인기 글

태그

Redux-saga
인증서 자동갱신
const
리덕스사가
백엔드
webpack
react
웹퍼블리셔
docker
https 인증서 발급
TAVE
let
Redux
프로그래머스
mysqld: can't open file: 'mysql.ibd' (errno: 0 - )
TypeScript
프론트엔드
4차산업혁명동아리
env파일 환경변수 인식
리덕스
자바스크립트
docker mysql workbench 연동하는 법
웹개발
Hook
next.js
ec2에 docker 설치
코딩테스트
JavaScript
propertykey
타입스크립트

최근 댓글

최근 글

hELLO· Designed By정상우.v4.6.0
king_hd
Optimistic Updates - react-query .feat(infinite queries)
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.