Apollo Client In memory Cache
- 아폴로 클라이언트에서 사용하는 기본 캐싱 메커니즘
- GraphQL 쿼리 결과를 메모리에 저장하여 빠른 액세스를 제공한다.
- 객체를 고유 ID 로 식별하여, 데이터를 정규화한다. 이를 통해 데이터 일관성을 유지하고 중복을 방지한다.
typePolicies
- 캐시 동작 커스터마이즈
- 각 GraphQL 타입에 대해, 아폴로클라이언트가 데이터를 어떻게 저장하고 읽을지 정의한다.
keyFields
: 객체를 고유하게 식별하는 필드 지정
fields
: 개별 필드에 대한 정책을 정의
merge
: 새로운 데이터가 기존 캐시와 어떻게 병합될 지 정의한다.
read
: 캐시에서 데이터를 어떻게 읽을지 정의한다.
apolloClient 에서 프래그먼트 Read & Update
- readFragment
- writeFragment
- 위의 함수들은 typePolicies 에서 정의된 캐싱 규칙을 따라 동작한다.
isOptimisticResponse
옵션으로 readFragment 를 실행할시, 낙관적 업데이틀를 지원한다.
- 이는 해당 필드는
returnPartialData
라는 의미로 사용된다.
- 캐시에서 요청한 프래그먼트의 일부 필드만 있어도 부분적인 데이터를 반환한다.
- 누락된 필드가 있어도 가능한 한 많은 데이터를 제공한다.
어떻게 fragment 단위로 read & write 이 가능할까?
- Apollo Client 는 GraphQL 응답을 받으면 이를 정규화하여 저장한다.
- 각 객체는
__typename
과 id (또는 _id
)를 조합하여 고유한 캐시 id 를 갖는다.
- 객체의 필드들은 이 캐시 id 아래에 저장된다.
- GraphQL 에서 Fragment 는 타입의 특정 필드 집합을 정의한다.
- Apollo Client 는 이 Fragment 정의를 사용하여, 캐시된 데이터의 일부분에 접근가능함.
const fragment = gql`
fragment UserName on User {
id
name
}
`;
// 읽기
const userData = client.readFragment({
id: 'User:1',
fragment: fragment
});
// 쓰기
client.writeFragment({
id: 'User:1',
fragment: fragment,
data: {
id: '1',
name: 'New Name'
}
});
- 아폴로 클라이언트는
User:1
객체의 id 와 name 필드에만 정확히 접근하고 수정한다. (read & write 모두)
- 다른 필드는 영향받지 않는다.