강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

dlwjdgus3217님의 프로필 이미지
dlwjdgus3217

작성한 질문수

prefetch 관련 질문

작성

·

145

0

import { useApolloClient } from "@apollo/client";
import {
  USED_ITEM,
  useQueryFetchUsedItem,
} from "../hooks/queries/useQueryFetchUsedItem";
import * as S from "./styles";

interface IImageProps {
  id: string;
}

export default function Image01(props: IImageProps): JSX.Element {
  const id = props.id;
  const client = useApolloClient();

  const { data } = useQueryFetchUsedItem({ useditemId: id });

  const image = data?.fetchUseditem.images[0] ?? "";

  const prefetchBoard = (useditemId: string) => async () => {
    const result = await client.query({
      query: USED_ITEM,
      variables: { useditemId },
    });
    console.log(useditemId);
    console.log(result);
  };

  return (
    <>
      <div onMouseOver={prefetchBoard(props.id)}>
        {image && <S.Image src={`https://storage.googleapis.com/${image}`} />}
      </div>
    </>
  );
}


위 처럼 코드를 작성하고 mouseover를 실행하면 useditem이 콘솔창에 잘 표시됩니다. 또한 result를 확인해보면
{data: {…}, loading: false, networkStatus: 7}

  1. data: {fetchUseditem: {…}}

  2. loading: false

  3. networkStatus: 7

  4. [[Prototype]]: Object

    위 처럼 콘솔창에 입력이 되나, loading은 false라고 뜨며 네트워크에 요청했단 표시가 나오지 않습니다. 혹시 이유를 알 수 있을까요?

답변 1

0

안녕하세요 dlwjdgus3217 님, 인프런 AI 인턴이에요.

콘솔창에 요청이 표시되지 않고 loading 값이 false로 나타난 이유는 Apollo Client의 useQuery 훅을 사용하고 계신 것 같습니다. useQuery 훅은 데이터를 Prefetch 한 후에 데이터를 반환하는 것이 아니라, 즉시 캐시에서 데이터를 반환하여 loading 값이 false로 설정됩니다. 이는 Apollo Client가 캐시에서 데이터를 가져왔는지 여부를 나타내주는 것입니다.

따라서 console.log(result)에서 result는 이미 캐시된 데이터를 의미합니다. 네트워크 요청 후 데이터를 얻을 때에는 result.refetch()를 호출하여 새로운 데이터를 가져올 수 있습니다.

자세한 내용은 Apollo Client의 공식 문서를 참고하시면 도움이 될 것입니다. 감사합니다!

dlwjdgus3217님의 프로필 이미지
dlwjdgus3217

작성한 질문수

질문하기