Apollo Client Caching

TwentyFiveSeven·2021년 5월 15일
0

Apollo Client Caching이란?

Apollo Client는 GraphQL 쿼리들의 결과정보들을 정규화 된 in-memory cache에 저장합니다.

Configuration

Data normalization

  • InMmoryCache 는 내부 데이터 저장소에 쿼리 응답 객체들을 저장히기 전 정규화 과정을 거칩니다.
    1. 캐시는 response에 포함 된 모든 식별 가능한 Object에 대해 고유한 ID를 생성합니다.
    2. 캐시는 flat lookup table에 ID별로 Object를 저장합니다.
    3. 들어오는 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' });
  • 제거 할 필드의 이름을 제공하여 캐시 된 객체에서 단일 필드를 제거 할 수도 있습니다.

  • 객체를 제거하면 캐시된 다른 객체에 연결할 수 없는 경우가 많기 때문에 하나 이상의 객체를 제거한 후에는 cache.gc() 메소드를 호출하여 닿을 수 엇ㅂ는 객체를 제거해야합니다.

profile
부지런한 웹개발자🌙

0개의 댓글