Optimistic UI(with SWR) 적용기

2024. 4. 15. 10:40·Next.js

사용 배경

진행하는 프로젝트에서 좋아요 기능을 넣을 일이 있었습니다.

api 요청 후 DB에 좋아요가 추가된 것까지 확인 했으나, 정작 UI에는 좋아요가 반영되어 있지 않습니다.

브라우저 refresh, refocusing 등 서버 데이터 변경을 감지한 후에야 비로소 UI에도 반영이 되는 것이죠.

이에 대한 해결책을 알아보던 도중 알게 된 개념인 Optimistic UI의 적용기를 기록해보았습니다.

개념 및 사용

  • Optimistic UI는 단어뜻 그대로 특정 요청이 성공 할 것이라(낙관적으로) 가정을 하고 미리 요청의 결과를 보여주는 방식의 UI입니다.
  • 사용 상황은 다음과 같습니다.
    • 어떤 요청이 거의 확실하게 의도대로 동작한다는 보장이 있을 때
    • 요청이 너무 늦지 않은 시간 안에 응답이 온다는 보장이 있을 때
    • 사용자에게 응답을 즉시 보여줘야 할 때

Next.js에서의 Optimistic UI(with SWR)

프로젝트에서 적용해본 Optimistic UI 예시입니다.

  • SWR의 mutate 함수를 사용하여 SWR이 가지고 있는 미리 캐시를 변경하고 POST 요청을 했습니다.
const Reaction = ({ memoId }: IProps) => {
  const { data: memoData, mutate: memoMutate } = useMemoData(memoId);
  const { mutation: likeMutation, loading: likeLoading } =
    useMutation<ILikeResponse>(`/api/likes?memoId=${memoId}`);

  const handleLike = () => {
    if (likeLoading) return;
		// memo에 속해있는 like를 mutate합니다.
    memoMutate(
      (prev) =>
        prev && {
          ...prev,
          isLiked: !prev.isLiked,
          likeLength: prev.isLiked ? prev.likeLength - 1 : prev.likeLength + 1,
        },
      false
    );
		// like를 변경하는 POST 요청을 합니다.
    likeMutation({}, "POST");
  };
  return (
    <>
      ...
        <LikeButton isLiked={!!memoData?.isLiked} handleLike={handleLike} />
      ...
    </>
  );
};
export default Reaction;
저작자표시 비영리 변경금지 (새창열림)

'Next.js' 카테고리의 다른 글

프로젝트 ‘공책’의 렌더링 (CSR vs SSR)  (1) 2024.04.15
Next/Image  (0) 2024.04.13
CSR / SSR / SSG / ISR  (1) 2024.04.12
'Next.js' 카테고리의 다른 글
  • 프로젝트 ‘공책’의 렌더링 (CSR vs SSR)
  • Next/Image
  • CSR / SSR / SSG / ISR
URE
URE
Skill: Javascript, ReactJS, Next.js, React Native ... *블로그 이전 작업(24. 04. 11 ~ 24. 04. 15)
  • URE
    Dev++
    URE
  • 전체
    오늘
    어제
    • 분류 전체보기 (51)
      • Browser (6)
      • OS (1)
      • Javascript (14)
      • React (19)
      • Next.js (4)
      • React Native (0)
      • Architecture (1)
      • Network (3)
      • 스크랩 (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Port
    JS
    자바스크립트
    리액트 코어
    react18
    참조타입
    swr
    원시타입
    react
    리덕스
    javascript
    리액트
    TCP
    IP
    react concurrent
    Redux
    브라우저
    URL
    상태관리라이브러리
    dataFetching
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
URE
Optimistic UI(with SWR) 적용기
상단으로

티스토리툴바