강의

멘토링

로드맵

Inflearn brand logo image

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

초무님의 프로필 이미지
초무

작성한 질문수

[코드캠프] 부트캠프에서 만든 '완벽한' 프론트엔드 코스

[12-04] 라이브러리 - 우편번호 모달

travel seller가 캐싱되지 않습니다.

해결된 질문

작성

·

63

0

fetchTravelproducts에서 클릭으로 상세 페이지로 들어가면

fetchTravelproduct 의 data 값을 보여주는데

API 요청에서 data 값을 확인하면 seller 값이 들어있는데 data.fetchTravelproduct.seller를 콘솔에 찍으면 null 이 뜹니다. (다른 데이터는 정상적으로 불러옵니다.)

 

fetchTravelproducts에서는 판매자 이름이 잘 출력이 되는데 상세페이지에 들어가면 해당 fetchTravelproduct API 요청으로 가져와도 판매자 데이터가 없는 상태로 뜨는데 문제가 뭘까요?

여기서 상세페이지에서 새로고침을 하면 정상적으로 판매자가 보여집니다.

 

fetchTravelproducts에서 캐싱하는 과정에 문제가 있는 걸 까요?

 

// 상세 페이지

import { Query } from "@/entities/api/graphql";
import { gql, useQuery } from "@apollo/client";

export const TRAVEL_PRODUCT = gql`
  query fetchTravelproduct($travelproductId: ID!) {
    fetchTravelproduct(travelproductId: $travelproductId) {
      _id
      name
      remarks
      contents
      price
      tags
      images
      pickedCount
      travelproductAddress {
        zipcode
        address
        addressDetail
        lat
        lng
      }
      seller {
        _id
        name
        picture
      }
      createdAt
    }
  }
`;

export const useFetchTravelProduct = ({ travelId }: { travelId: string }) => {
  const result = useQuery<Pick<Query, "fetchTravelproduct">>(TRAVEL_PRODUCT, {
    variables: { travelproductId: travelId },
  });

  return result;
};
// 목록 페이지

import { Query } from "@/entities/api/graphql";
import { gql, useQuery } from "@apollo/client";

const TRAVEL_PRODUCTS = gql`
  query fetchTravelproducts($isSoldout: Boolean, $search: String, $page: Int) {
    fetchTravelproducts(isSoldout: $isSoldout, search: $search, page: $page) {
      _id
      name
      remarks
      contents
      price
      tags
      images
      pickedCount
      travelproductAddress {
        zipcode
        address
        addressDetail
        lat
        lng
      }
      buyer {
        _id
        name
        picture
      }
      seller {
        _id
        name
        picture
      }
      createdAt
    }
  }
`;

interface UseFetchTravelProductsArgs {
  isSoldout: boolean;
  search: string | null;
  page: number;
}

export const useFetchTravelProducts = ({
  isSoldout,
  search,
  page,
}: UseFetchTravelProductsArgs) => {
  const result = useQuery<Pick<Query, "fetchTravelproducts">>(TRAVEL_PRODUCTS, {
    variables: {
      isSoldout,
      search,
      page,
    },
  });

  return result;
};

답변 2

0

노원두님의 프로필 이미지
노원두
지식공유자

안녕하세요! 초무님!

페이지 이동시에는 잘 안나오고, 새로고침시 제대로 불러와진다고 하신걸 보면, 두 요청간에 어떠한 차이가 있는지 먼저 확인해 볼 필요가 있겠어요!

개발자도구에서 네트워크탭을 열어놓고, graphql 요청시 들어가는 variables의 차이와, 응답으로 받는 response 부분의 차이, 또는 둘 간의 header 부분에 토큰 등의 차이를 비교해 보세요!

0

안녕하세요, 인프런 AI 인턴입니다.

초무님, 캐싱 문제와 관련하여 몇 가지 확인해볼 수 있는 부분을 안내드리겠습니다:

  1. Apollo Client의 Cache 설정 확인:

    • Apollo Client에서 fetchTravelproduct와 fetchTravelproducts 쿼리가 동일한 캐시 키를 사용하고 있는지 확인해주세요. 두 쿼리는 사용하는 필드가 다르기 때문에, Apollo Client의 캐시는 기본적으로 response의 형태를 기준으로 캐싱합니다.
    • fetchPolicy 설정을 한번 확인해보세요. ‘cache-and-network’, ‘network-only’ 등 적절히 설정되어 있는지 확인해 주세요.
  2. Schema의 정확성:

    • 스키마 정의를 다시 한 번 확인해주세요. 두 쿼리에서 사용하는 필드가 스키마에 맞게 설정되어 있는지, 그리고 판매자(seller) 필드가 올바르게 요청되고 있는지 검사해 보세요.
  3. 데이터 로딩 과정 확인:

    • 상세 페이지에서 데이터 로딩이 완료된 후에 화면에 그려지고 있는지, useQuery의 loading 상태와 error 상태를 체크하여 명시적으로 처리해보세요.
  4. React 상태 관리 확인:

    • 상세 페이지에서 특정 조건에서만 데이터가 나타나지 않는다면, 데이터가 의도치 않게 초기화되거나 업데이트되지 않는 경우일 수 있습니다. refresh 후에 정상적으로 나타난다고 하셨으므로 이 부분을 한번 체크해보시기 바랍니다.

참고: 상세 페이지에서 수동으로 데이터를 다시 fetch할 수도 있습니다. 예를 들어, useEffect를 사용하여 해당 페이지가 로드되었을 때 데이터를 다시 가져오도록 할 수 있습니다.

위 방법들이 도움이 되기를 바랍니다. 추가적인 설정이나 코드 로직에 관한 질문이 있으시면 언제든지 질문해 주세요.

캐싱과 관련된 더 많은 정보는 공식 문서를 참조하시길 추천드립니다:
- Apollo Client Caching

그리고 GraphQL API 사용 시 실제 필드명이 스키마와 일치하는지, 객체의 구조가 올바른지 확인하는 것도 중요합니다. 문제 해결에 도움이 되길 바랍니다.

초무님의 프로필 이미지
초무

작성한 질문수

질문하기