문제 배경

개선

1. 원인 분석

해당 문제는 useQuery 훅에서 queryKey가 변경됨에 따라 데이터를 다시 fetch하는 과정에서 발생하였다.

기존 데이터를 유지하지 않고 새 데이터를 받아오기 전까지 로딩 스피너만 표시되었기 때문에, 순간적으로 빈 영역이 생기면서 화면이 깜빡이고 CLS 수치가 상승한 것이다.

2. Tanstack Query 옵션 적용

이를 해결하기 위해 placeholderDatakeepPreviousData 옵션을 적용하였다.

<aside> 💬

두 옵션은 무슨 역할을 하는가?

[참고] placeholderData 가 적용된 개선된 코드

import { keepPreviousData, useQuery } from '@tanstack/react-query';

export default function useDefaultQuery(key: any[], url: string) {
  const { data, isPending, isError, error, isFetching, isPlaceholderData } =
    useQuery({
      queryKey: key,
      queryFn: () => getDefaultFetcher(url, ApiType.INTERNAL),
      placeholderData: keepPreviousData,
    });
  if (isError) toast.error('데이터 조회에 실패하였습니다.');
  return { data, isPending, isError, error, isFetching, isPlaceholderData };
}

3. 화면 요소의 최소 크기 고려

추가적으로 CLS 문제를 방지하기 위해 컴포넌트의 최소 높이(min-height)나 넓이(min-width)를 고려하였다.

렌더링 경계 요소에 명시적으로 크기를 지정하지 않으면, 데이터가 로드되지 않은 순간에 레이아웃이 흔들릴 수 있기 때문이다.

마지막으로, 형제 요소 간의 충돌도 고려하여 전체 레이아웃 안정성을 확보하였다.