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

squirrel PARK님의 프로필 이미지

작성한 질문수

Next + React Query로 SNS 서비스 만들기

react-query SSR 설정하기

fetch가 force-cache여도 qn의 invalidateQueries가 가능한가요?

해결된 질문

24.09.17 18:13 작성

·

52

·

수정됨

0

안녕하세요.

강의를 복습하다가 캐싱 기능에 대해 질문이 생겼습니다.

 

 Next에서 fetch의 cache: 'force-cache'를 설정하면, 데이터가 공적 캐싱으로 처리된다고 알고 있습니다.

 

여기서 게시판을 예로 들어보면,

게시물을 새로 포스팅하면 전체 게시물 목록을 갱신해야 하기 때문에 서버에서는 cache: 'no-store'를 설정하여 항상 최신 데이터를 가져오고, 클라이언트에서는 qn을 이용해서 staleTime을 설정하여 데이터를 일정 시간 동안 캐싱하고 있습니다.

 

"force-cache"와 "useQuery" 내 두 번의 캐싱이 발생하여 비 효율적일 수 있다고 생각되어 cache: 'no-store'를 사용하여 클라이언트에서만 캐싱하고 있었는데요.

 

생각해보니 fetch를 이용해서 공적으로 캐싱하는게 성능적으로 우월할거 같아서 "force-cache"로 변경하고 invalidateQueries를 이용하여 클라이언트에서 post되면 데이터를 갱신하도록 변경하고 테스트를 해보았는데 잘되는게 이해가 되질 않습니다.

 

서버는 초기 항상 캐싱된 데이터를 반환하기 때문에 데이터가 상이할줄 알았는데 터미널을 봐도

post하고 리스트를 갱신할때만 Api 호출하고 이후엔 캐싱된 데이터를 잘 사용합니다.

 

이 경우, 사용자가 데이터를 갱신하면 서버의 캐시가 자동으로 업데이트되고, 공적 캐싱을 사용하여 효율적으로 데이터를 관리할 수 있는 건가요?

 

 

 

 

 

 

답변 2

0

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

2024. 09. 17. 18:24

프론트에서 사용하는 invalidateQueries의 fetch와 Next SSR의 fetch는 서로 다른 fetch라서 캐시가 업데이트 될 것입니다. 첫 페이지 진입만 Next SSR의 fetch가 돌고 그 다음부터는 클라이언트 react-query의 fetch가 돌게 됩니다.

squirrel PARK님의 프로필 이미지
squirrel PARK
질문자

2024. 09. 17. 22:13

아.. 다른거였군요 새로고침하니까 되돌아가네요.ㅠ 감사합니다

0

인프런 AI 인턴님의 프로필 이미지

2024. 09. 17. 18:16

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

Next.js와 React Query에서 캐싱과 데이터 갱신에 대해 좋은 질문을 주셨습니다.

먼저, Next.js의 cache: 'force-cache' 설정은 클라이언트 측에서는 데이터를 공적으로 캐싱하여 요청이 발생할 때마다 네트워크를 통해 최신 데이터를 요청하지 않고, 캐시된 데이터를 사용하도록 합니다. 이러한 설정이 클라이언트 측에서 성능을 개선하는 데 기여할 수 있습니다.

그러나 클라이언트 측에서 데이터를 효율적으로 갱신하기 위해 invalidateQueries를 사용하시는 부분에 대해서는 다음과 같은 점을 유의하셔야 합니다:

  1. InvalidateQueries와 Force-Cache 간의 공조:

    • 클라이언트에서 invalidateQueries를 호출하면 React Query는 클라이언트 측 캐시를 무효화하고 새 데이터를 가져오게 됩니다. 이때 네트워크 요청이 발생하며, fetch는 서버에 데이터를 요청하게 됩니다.
    • cache: 'force-cache' 설정은 서버가 이미 캐싱된 데이터를 제공하도록 하지만, 새로운 데이터를 가져오려면 서버 측에서 추가적인 캐시 무효화 로직이 필요할 수 있습니다. 일반적으로 서버의 캐시를 갱신하는 로직은 캐시 기간이 지난 경우나 특정 이벤트(예: 새 게시물 포스팅)가 발생할 때 트리거됩니다.
  2. 클라이언트 측에서 최대한 최신 데이터 유지:

    • 클라이언트에서 데이터를 최신으로 유지하려면 staleTime, cacheTime과 같은 React Query의 옵션을 적절히 설정하고, 그리고 prefetchQueryrefetch 메소드를 이용하여 데이터가 사용될 시점에 최신 데이터를 미리 가져오는 방식을 권장합니다.

아래는 관련하여 참고하실 수 있는 유사한 질문과 답변입니다:

이 질문에서 Next.js와 React Query의 useQueryprefetchQuery를 사용하는 경우 서로 다른 페이지에서 캐시 데이터를 공유하고 갱신하는 방법에 대해 다루고 있습니다.

다른 관련된 Q&A 글들도 참고해 보시면, squirrel PARK님께서 언급하신 문제의 이해를 더 넓히실 수 있을 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.