Optimistic UI

lynn·2022년 6월 26일
0

Front-End

목록 보기
22/24

optimistic ui
통신이 느린 컴퓨터에 api 요청을 하게될때 요청이 서버에 도달하기도 전에 화면의 값을 바꾸는 것

언제 사용하는지?
1. 99%성공할 것이 예상되는 api 요청할 때 사용
2. 1% 실패하더라도 문제가 안되는 api 요청할 때 사용

->단순히 좋아요 수를 업데이트 하는 등 중요하지 않고 실패 확률이 낮을 경우 사용한다.

데이터가 중요할 때는 사용하면 안된다.

사용 예시)
좋아요 버튼을 누르면 likeBoard api 요청 전송
요청 응답 후 fetchBoard(게시글 조회) api를 요청해서 좋아요 수를 업데이트

import { gql, useMutation, useQuery } from "@apollo/client";
const FETCH_BOARD = gql`
  query fetchBoard($boardId: ID!) {
    fetchBoard(boardId: $boardId) {
      _id
      likeCount
    }
  }
`;
const LIKE_BOARD = gql`
  mutation likeBoard($boardId: ID!) {
    likeBoard(boardId: $boardId)
  }
`;

export default function OptimisticUIPage() {
  const { data } = useQuery(FETCH_BOARD, {
    variables: { boardId: 게시글아이디 },
  });
  const [likeBoard] = useMutation(LIKE_BOARD);

  const onClickLike = () => {
    likeBoard({
      variables: { boardId: 게시글아이디 },
      
      //refetchQueries 대신 optimisticResponse 사용
      optimisticResponse: {
        // 먼저 보내는 데이터
        likeBoard: (data?.fetchBoard.likeCount || 0) + 1,
      },
      update(cache, { data }) {
        // data: 진짜 데이터
        // 캐시를 먼저 수정해서 빠른 것처럼 보임
        cache.writeQuery({
          query: FETCH_BOARD,
          variables: {
            boardId: 게시글아이디,
          },
          data: {
            fetchBoard: {
              _id: 게시글아이디,
              likeCount: data.likeBoard,
            },
          },
        });
      },
    });
  };

  return (
    <div>
      <div>좋아요 수 :{data?.fetchBoard.likeCount}</div>
      <button onClick={onClickLike}>좋아요</button>
    </div>
  );
}
profile
개발 공부한 걸 올립니다

0개의 댓글