Optimistic-UI

OwlSuri·2022년 4월 28일
0
post-custom-banner

느리면 눈속임이라도??

좋아요버튼 누르면 좋아요 숫자 증가
백엔드에 데이터 보내고 받아오기, 리페치하기 해야함 -> 느림

먼저 숫자만 올려놓고 DB에 보내고 받아와서 일치하면 그대로 두는 방법
실패할 가능성이 매우 낮은 경우 이렇게 눈속임하면 빠름(가짜 좋아요를 만듦) -> Optimistic-UI

response를 두번 받음
한번은 가짜, 한번은 진짜

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: "6263f038a8255b002988c134"},
    })
    
    const [likeBoard] = useMutation(LIKE_BOARD)

    const onClickOptimisticUI = async () => {
        await likeBoard({
            variables:{ boardId : "6263f038a8255b002988c134" },
            // 리페치쿼리 - 두번요청
            // refetchQueries:[
            //     {
            //         query: FETCH_BOARD,
            //         variables : { boardId : "6263f038a8255b002988c134" },
            //     },
            // ]

            // cache state 직접 수정하는 방법과 함께 쓸 수 있음
            optimisticResponse:{
                // 여기서 쓴 값은 아래 data. 으로 들어감
                likeBoard : (data?.fetchBoard.likeCount || 0 ) +1,
                // 기존에 있던 값 (없으면 0) +1
            },
            // cache state 직접 수정하는 방법
            update(cache, {data}){
                cache.writeQuery({
                    query :FETCH_BOARD,
                    variables:{boardId: "6263f038a8255b002988c134" },
                    data:{
                        fetchBoard:{
                            _id : "6263f038a8255b002988c134",
                            __typename: "Board",
                            // 위 두개 필수입력 이걸로 글로벌스테이트에서 구별
                            likeCount : data.likeBoard,
                        }
                    }
                })

            }
        })

    }
    
    return(
        <div>
            <h1>Optimistic UI</h1>
            <div>현재카운트(좋아요): {data?.fetchBoard.likeCount}</div>
            <button onClick={onClickOptimisticUI}>좋아요 올리기</button>
        </div>
    )
}

개발자의 컴퓨터는 빠르지만
사용자의 느린 컴퓨터를 고려해야 한다.

refetch로 하는 것보다 optimistic responce로 바꾸면 훨씬 바르게 결과를 볼 수 있다.

profile
기억이 안되면, 기록을 -
post-custom-banner

0개의 댓글