Apollo Client Caching이란?
Apollo Client는 GraphQL 쿼리들의 결과정보들을 정규화 된 in-memory cache에 저장합니다.
Configuration
Data normalization
InMmoryCache
는 내부 데이터 저장소에 쿼리 응답 객체들을 저장히기 전 정규화 과정을 거칩니다.
- 캐시는 response에 포함 된 모든 식별 가능한 Object에 대해 고유한 ID를 생성합니다.
- 캐시는 flat lookup table에 ID별로 Object를 저장합니다.
- 들어오는 Object가 기존 Object와 동일한 ID를 갖고 있으면 Object의 Field가 결합됩니다.
- 만약 들어온 객체와 이미 존재하는 객체가 같은 필드를 갖고 있다면 겹치는 필드의 캐시 값을 덮어 씌우게 됩니다.
- 서로 같은 겹치는 필드가 존재하지 않는다면 필드는 유지됩니다.
Generating unique identifiers
- default 값으로
InMmoryCache
는 __typename
필드와 같은 unique identifier를 생성성합니다.
- 또한 이를 위해 세부적으로 id 필드와 결합하여
:
을 통해서 구분하게 됩니다.
Garbage collection and cache eviction
- Apollo Client는 캐시된 데이터를 선택적으로 제거할 수 있습니다.
- gc 메소드의 기본 가비지 콜렉션 전략은 대부분의 애플리케이션에 적합합니다.
- evict 메소드는 애플리케이션을 위한 세밀한 제어를 제공합니다.
cache.gc()
- gc 메소드는 연결할 수 없는 정규화된 캐시의 모든 객체를 제거합니다.
- 객체에 도달할 수 있는지 확인하는 방법은, root Object 부터 시작하여 재귀적으로 방문 가능한 모든 자식 객체들을 방문합니다.
- 방문되지 않는 정규화 객체들은 제거되는데 이와 같은 방법은 mark & sweep과 동일합니다.
- cache.gc() 함수는 제거된 객체들의 ID 리스트를 반환합니다.
cache.evict()
cache.evict({ id: 'my-object-id' })
- evict 메소드를 사용하여 캐시에서 정규화 된 객체를 제거 할 수 있습니다.
cache.evict({ id: 'my-object-id', fieldName: 'yearOfFounding' });