[swift] 아폴로 클라이언트의 캐시 관리 방법

아폴로(Apollo)는 GraphQL을 기반으로한 클라이언트 라이브러리로, 쿼리와 뮤테이션을 서버에 보내고 그 결과를 받아오는 역할을 합니다. 아폴로 클라이언트는 내부적으로 캐시를 관리하는데, 이를 통해 성능을 향상시키고 중복된 네트워크 요청을 줄일 수 있습니다.

1. 아폴로 클라이언트 캐시

아폴로 클라이언트는 기본적으로 InMemoryCache를 사용하여 데이터를 캐시에 저장합니다. 이 캐시는 내부적으로 키-값 형태로 데이터를 저장하고, 쿼리 결과를 키와 연결하여 저장합니다. 이후에 동일한 쿼리가 실행되면 캐시를 통해 결과를 반환할 수 있습니다.

import Apollo

let apolloClient = ApolloClient(url: URL(string: "https://api.example.com/graphql")!)

// 사용자 정보를 가져오는 쿼리
let userQuery = GetUserQuery(userId: "123")

// 캐시된 결과 확인
if let user = apolloClient.store.cache.key(for: userQuery) {
    print("Cached user:", user)
} else {
    // 캐시가 없는 경우 서버에 요청하여 데이터 가져오기
    apolloClient.fetch(query: userQuery) { result in
        // 결과 처리
    }
}

2. 캐시 제어하기

아폴로 클라이언트는 쿼리와 뮤테이션 결과를 자동으로 캐시에 저장하고 요청 결과를 반환하는데, 때로는 이를 제어할 필요가 있습니다.

2.1. 캐시 비활성화

일부 상황에서는 쿼리 결과를 캐시에 저장하지 않거나, 캐시된 결과를 사용하지 않고 항상 서버에 요청하고자 할 수 있습니다. 이 경우 fetch 메서드에 fetchPolicy를 지정하여 캐시를 비활성화할 수 있습니다.

apolloClient.fetch(query: userQuery, fetchPolicy: .networkOnly) { result in
    // 항상 서버에 요청하여 데이터 가져오기
}

2.2. 캐시 갱신

캐시된 데이터를 갱신하고 새로운 결과를 캐시에 저장하려면 refetch 메서드를 사용할 수 있습니다. 이는 서버에 재요청하여 최신 데이터를 가져온 후 캐시에 저장합니다.

apolloClient.refetch(query: userQuery) { result in
    // 새로운 결과를 캐시에 저장하고 반환
}

3. 캐시 지우기

아폴로 클라이언트의 캐시를 완전히 지우려면 clearCache 메서드를 사용할 수 있습니다.

apolloClient.clearCache()

참고 자료