리액트 쿼리는 개발자에게 캐시 설정을 쉽게 할 수 있는 옵션을 제공한다.
바로 cacheTime
과 staleTime
fetching : 요청 중인 쿼리
fresh : 새롭게 추가된 쿼리 (만료되지 않아, 컴포넌트가 마운트/업데이트 되어도 데이터를 재요청하지 않는다.)
stale : 만료된 쿼리 (만료되었기 때문에, 컴포넌트가 마운트/업데이트 되면 데이터를 재요청한다.)
inactive : 비활성화된 쿼리 (사용되지 않는 쿼리로, 일정 시간이 지나면 가비지 컬렉터가 캐시에서 제거한다.)
cacheTime
inactive 상태일 때 메모리에 캐시를 언제까지 유지할 지에 관한 시간
메모리에 저장된 캐시 데이터가 언제까지 유지될지 알려주는 옵션 (default = 5분)
staleTime
fresh -> stale까지의 시간
데이터의 신선한 상태가 언제까지 지속될지에 관한 시간 (default = 0)
리액트 쿼리는 데이터를 패칭한 후 응답받은 데이터를 캐시 메모리에 캐시한다.
cacheTime
은 이 캐시된 데이터를 저장하는 시간을 지정할 수 있다.
만약 cacheTime
에 설정한 시간이 경과되면 가비지 컬렉터의 가비지 컬렉팅 대상이 된다. 그리고 cacaheTime
이 경과되기 전에 재요청을 보낸다면 요청이 가는 것이 아닌 캐시되어 있는 데이터를 응답하여 불필요한 통신에 대한 리소스 절약을 도모할 수 있다는 장점이 있다.
staleTime
은 캐시된 데이터에 대한 제검증에 대한 시간을 지정할 수 있다.
staleTime
에 지정한 시간이 경과되면 요청을 보내 서버의 상태를 가져와 캐시 데이터를 최신화한다.
이런 캐시 설정은 객관적인 데이터를 기반으로 설정해야 한다. 사용자의 행동을 기반으로 사용자 경험이 떨어지지 않고 네트워크 비용을 최소화 해야 하기 때문이다.
하지만 레벨로그 프로젝트에서는 이런 객관적인 데이터를 제공하는 직군이 존재하지 않기에 사용자 입장에서 생각해보고 결과를 도출하였다.
cacaheTime 0 설정 : 인터뷰 팀 상세 페이지, 레벨로그 수정 페이지, 사전질문 수정 페이지
staleTime 60 설정 : 받은 피드백들 보여주는 페이지, 받은 인터뷰 질문들 보여주는 페이지
재검증해야하는 빈도가 낮다고 생각함, 왜냐하면 인터뷰가 종료하고 보는 컨텐츠이기 때문
대신 피드백이나 인터뷰 질문 작성시 invalidateQueries 를 통해 캐시 재검증하도록
staleTime 600 설정 : 인터뷰 검색 결과 페이지
또한 이 cacheTime
과 staleTime
을 쿼리마다 다르게 지정할 수 있다는 장점도 존재한다. 하지만 useQuery를 통해 응답받은 데이터만 가능하다. 왜냐하면 get 요청으로 응답 받은 데이터를 제외한 post, delete, put 요청은 캐시를 하는 비용이 더 크다고 리액트 쿼리에서 판단했기 때문이다.
브라우저는 자체적인 캐시 타임을 가지고 있다. 이것을 휴리스틱 캐시라고 하는데 이는 동일한 사용자 경험을 제공하는 것에 좋지 않다. 이로 인해 웹 캐시 설정을 하는 것이 네트워크 비용 절약 뿐만 아니라 동일한 사용자 경험을 제공할 수도 있다.
max-age
데이터를 캐시하는 최대 시간을 지정할 수 있다.
해당 시간이 경과되지 않으면 리소스를 캐시 메모리에서 응답한다.
브라우저에 저장된 캐시는 사용자가 직접 지우지 않는 이상 개발자가 조절할 수 없다.
그래서 최신 리소스를 바라보게 하기 위해 번들링할 때 content hash를 지정해서 파일명이 다르다는 것을 인지시킬 수 있다.
레벨로그 서비스에서는
HTML 파일은 max-age = 0
HTML 파일은 항상 재검증을 한다.
레벨로그 서비스는 SPA, CSR 방식으로 이 HTML 파일이 가볍다는 점이 존재한다.
그래서 HTML 파일 재검증을 통해 HTML 파일의 script 태그(js 파일)의 파일명(content-hash)이 변경 되었다면 해당하는 js 파일도 재검증하는 과정을 거친다.
다른 정적 리소스(js, image, font등)는 max-age = 1년
no-cache
max-age=0
과 동일하게 동작한다. 캐시는 저장하지만 사용하려고 할 때마다 서버에 재검증 요청을 보낸다.no-store
이 둘의 차이는 일부 모바일 브라우저의 경우 브라우저를 종료하기전까지 리소스가 만료되지 않는 경우가 있어 모든 브라우저에서 동일한 사용자 경험을 제공하기 위해서는 no-store를 사용하는 것이 좋는 것이 좋다.
CDN과 같은 중간 서버가 리소스를 캐시할 수 있는지 여부를 결정할 수 있는 설정이 존재한다. public
, private
public
private
s-maxage
브라우저 캐시에는 메모리 캐시와 디스크 캐시가 존재한다.
memory cache
disk cache
캐시 메모리와 디스크 캐시에 저장되는 기준은 제가 찾아본 결과 리소스 용량이라고 추정한다. 캐시 메모리는 8KB에서 8MB로 작은 용량이 이므로 그 이상의 리소스인 경우에는 디스크 캐시에 저장된다.