아리의 iOS 탐구생활

[URLRequst] 네트워크 요청 시 캐시 제어 하는 방법 본문

Swift/문제해결

[URLRequst] 네트워크 요청 시 캐시 제어 하는 방법

Ari Lee 2022. 9. 23. 11:29
반응형

# 문제 상황

 

스타 체크 해제 후 새로고침 시 이전 데이터를 불러와서 제대로 업데이트 되지 않는 현상

 

Github API로 스타표시를 변경한 후 (PUT), 사용자의 스타 체크한 레파지토리 목록을 불러올 때 (GET), 업데이트 된 목록이 아니라

기존에 불러왔었던 Response를 불러오는 문제로 레파지토리 목록이 업데이트가 제대로 되지 않는 현상이였다.

정확히는 바로 새 데이터로 업데이트 되지 않고, 몇초 이후에 다시 네트워크 요청을 하여 재시도하면 새 데이터를 불러오는듯한 현상이였다.

 

 

 

# 고민 해보기

  • 왜 PUT 이후 GET을 요청했을 때, 업데이트 된 레파지토리 목록을 불러오는데 시간이 걸릴까?
  • API 자체적인 문제인가? 포스트맨으로도 테스트 해보자!
  • 정상이다. 혹시 리스폰스를 캐시처리 하나...?

 

기존에 요청해서 받았던 리스폰스가 캐싱되어 새롭게 업데이트 된 데이터를 불러오는 것이 아니라

캐시처리 되어있는 리스폰스를 불러오는 것 같다는 생각이 들었다.

 

 

 

# 시도하기

URLSessionConfiguration의 속성을 ephemeral로 할당한 후 테스트 해본 결과,

정상적으로 새롭게 업데이트 된 Response를 받아왔다.

 

  • Ephemeral session
    • 델리게이트 없이 비공개(private) 세션
    • Delegate없이 비공개 세션을 만들 때 사용한다.
    • 사파리나 크롬에서 시크릿 모드를 만들 때 사용한다.
    • 쿠키나 세션정보가 남아있지 않게 된다.

 

하지만 이걸로 문제를 완벽히 해결되었다고 결론내기가 찝찝했다.

그 이유는 ephemeral 속성의 경우 다른 네트워크 요청들도 캐시가 적용되지 않는다는 점이다.

변하지 않는 큰 데이터의 경우는 캐시처리가 되는 것이 더 도움이 될탠데... 하는 생각이 들어서

특정 요청만 캐시처리를 하지 않도록 하고 싶었다.

 

그래서 다시 찾아본 결과 URLRequest 내부 속성중에는 캐시 정책을 설정할 수 있는 속성이 있었다.

또한 아예 네트워크 요청 시 HeaderCache-Control을 할당해서 리스폰스를 캐시하지 않겠다고 하고 네트워크를 요청할 수도 있다.

 

 

# 해결 방법

위와 같이 URLRequest 속성중 cachePolicy .reloadIgnoringLocalCacheData로 할당해주어서 해결하였다.

헤더에 Cache-Control를 할당주어 데이터를 요청 시에 Cache 관련 제어를 하는 방법도 있지만

하드 코딩이라는 생각이 들어서 이러한 방법으로 해결하게 되었다.

 

Header를 통한 해결 방법

// Request 타입 중 속성...
var headers: [String : String]? {
    return [
        "Authorization": "token \(KeyChainManager.shard.load(GithubAuthorize.token) ?? "")",
        "Cache-Control": "no-store" // 이 부분을 추가하여 리스폰스를 캐시처리 하지 않도록 요청
    ]
}

 

 

URLRequest의 프로퍼티를 이용한 해결 방법

var request = URLRequest(url: url)

// 캐시 정책 할당 (로컬 캐시 데이터 무시)
request.cachePolicy = .reloadIgnoringLocalCacheData 

 

캐시 정책 수정 후 정상적으로 새로운 데이터를 가져오는 모습.

 

 

Reference

 

'Cache-Control'이 필요한 이유

앱의 성능을 향상시키는 방법 중 하나인 캐시. 클라이언트에서 캐쉬를 하고, 서버에서 컨트롤이 가능한 Cache-Control에 대해서 알아봅니다.

www.blog-dreamus.com

 

Deep dive into Apple’s URLRequest Cache Policies

Hands-On analysis of Apple’s Cache Policies working together with a Node.js Express Server to increase API efficiency and performance

medium.nextlevelswift.com

 

Apple Developer Documentation

 

developer.apple.com

 

Apple Developer Documentation

 

developer.apple.com

 

반응형
Comments