Skip to content

CacheControl 활용한 트래픽 최적화 #11

@yeahg-dev

Description

@yeahg-dev

캐시의 필요성 인식

iTunesAPI를 호출해 빈번하게 데이터를 받아올 수 있습니다. 그래서 캐시를 사용해 통신 트래픽을 줄이고, 데이터를 보여주는데 필요한 시간을 단축시키고자 했습니다.

문제 상황

URLCache를 사용한 캐싱 방법을 생각했습니다. URLRequest의 response가 캐시에 존재한다면 캐시된 response를 반환하고, 없다면 서버에 요청을 보내려 했습니다.

하지만, 이 방법으로 구현시 서버와 캐시된 데이터 간 불일치 문제가 발생할 수 있습니다.

해결 방법

HTTP header의 Cache-Control을 no-cache로 설정했습니다. no-cache는 캐시 데이터를 사용자에게 보여주기 이전에, 서버에 캐시 데이터가 서버의 데이터와 동일한지 유효성 검증을 하도록 강제합니다. 매 요청 마다 통신을 하는 것은 피할 수 없지만, 캐시가 유효할 땐 데이터 다운로드 비용을 절감할 수 있기 때문에 효용성이 있다고 판단했습니다.

HTTP Header

  • HTTP Header에 Cache-Control 항목 추가
extension iTunesAPIRequest {
    ...
    var header: [String: String] {
        ["Content-Type": "application/json",
         "Accept": "application/json",
         "Cache-control": "no-cache"]
    }
}

URLSession의 configuration 변경

  • 캐시를 지원하는 URLSessionConfiguration.default으로 URLSession을 생성했습니다.
  • 캐시 정책을 useProtocolCachePolicy로 설정하여, request마다 유효성을 검증하는 로직을 사용하도록 했습니다.
extension iTunesAPIService {
    
    static let sessionWithDefaultConfiguration: URLSession = {
        let defaultConfiguration = URLSessionConfiguration.default
        defaultConfiguration.requestCachePolicy = .useProtocolCachePolicy
        return URLSession(configuration: defaultConfiguration)
    }()
    
}

캐시 작동 확인 테스트

의도한바대로 실제로 잘 동작하는지 확인하기 위해 2가지 테스트를 진행했습니다.

  1. 캐시 데이터와 서버 데이터가 동일하다면 cachedResponse를 리턴하는지

  2. 캐시 데이터와 서버 데이터가 다르다면 서버에 요청하여 받은 최신 Response를 리턴하는지

performance test

Metadata

Metadata

Assignees

Labels

Projects

Status

🌫 Behind

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions