본문 바로가기
iOS/궁금증

[NSCache&URLCache]왜 이미지 파일이 URLCache에서 메모리가 아닌 디스크에 저장될까?

by MINT09 2024. 1. 28.

데이터들은 어디에 저장되고 어떻게 사용될까?

먼저 하드 디스크에 우리의 데이터들이 전부 저장된다. 때문에 하드 디스크는 용량이 매우 크고, 기억을 하는 것에 치중되어 있다.

RAM, 메모리는 그러한 하드 디스크에서 앱을 실행하는데에 필요한 중요 데이터들을 들고 있다. 그러나 여전히 내용은 방대하고, RAM은 디스크보단 기억할 수 있는 양이 적고, CPU와 가까워서 빠르지만 어찌 되었건 기억을 하는 것에만 능력이 치중되어 있다.

CPU는 RAM에서 받은 데이터들을 이용해 앱을 실행한다. 기억보다는 성능이 중요해, 꾸준하게 성능이 업그레이드 되어 왔다. 때문에 RAM과 CPU는 기억과 성능으로 각자의 목적이 다르기에 서로서로 성능차이가 점점 심하게 나게 된다. RAM이 CPU를 쫓아가지 못해 CPU가 RAM이 데이터를 찾아서 주기를 기다려야 하는 병목 현상이 발생한 것이다.

이를 해결하기 위해 완충기의 역할을 하는 캐시 메모리가 등장했다. 캐시 메모리는 데이터를 가져오는 속도를 높이고 비용을 낮추기 위해 사용한다. CPU의 일부라고도 볼 수 있게 작은 칩으로 CPU에 직접 붙어 있거나 연결되어 있다.

  • 캐시 메모리 저장 규칙
    • 시간 지역성 : 최근에 접근된 데이터, 짧은 시간에 동일한 데이터에 반복적으로 사용
    • 공간 지역성 : 최근에 접근된 데이터의 주변 데이터

그러나 이러한 캐시 메모리는 하드웨어적인 부분이다.

💡 자주 사용하는 데이터나 값을 미리 복사해놓는 임시 공간.

때문에 이러한 캐시의 개념에 충족하기만 하다면 캐시는 CPU, 메모리, 하드 디스크 어디에서든 만들어질 수 있다.

  • CDN(Contents Delivery Network): 서버가 외국에 있는 경우 로컬용으로 따로 데이터를 미리 저장해두는. (캐시와 개념상 유사)

🔥 NS Cache

class NSCache<KeyType, ObjectType> : NSObject where KeyType : AnyObject, ObjectType : AnyObject
  • ios에서 사용할 수 있는 캐싱 방식 중 하나.
  • key - value
  • 메모리 캐시
  • 자동 제거 정책

🔥 URL Cache

class URLCache : NSObject
class var shared: URLCache { get set }
  • ios에서 사용할 수 있는 캐싱 방식 중 하나.
  • request - response
  • 캐시되어 있는 파일들을 클라이언트의 요청에 따라 찾아서 매칭시켜준다.
  • 메모리/ 디스크 캐시 모두 가능.
      메모리 디스크
    속도 빠름 늦음
    용량 적음 많음
    저장 기간 기기 종료시 삭제됨 기기 종료되도 남아있음.

이에 URL Cache가 이미지 파일을 불러오는 것에 있어서 메모리에 캐싱하고 가지고 오게 해주고 싶었다. 그런데 policy를 allowedInMemoryOnly로 해주었더니 매번 새로운 이미지만 가져왔다.

왜일까? Policies의 defalut값으로는 URLCache는 request에 대한 response를 온디스크와 인메모리 둘 다에 저장할 수 있다는데. 이는 용량 차이에 있었다. URL Cache의 내부 구현을 살펴보면 메모리 4MB, 디스크 20MB를 가지고 있다. 또한 관련 설명에 response가 캐시 용량의 5% 이상인 경우는 저장되지 않고 매번 새로운 request를 보낸다.

그렇다면 용량을 바꿔주면 어떻게 될까?

policy는 여전히 allowedInMemoryOnly지만, memory의 용량을 늘렸더니 캐시된 데이터가 존재하는 것을 볼 수 있었다. 즉, 용량 차이 때문이었다! 이미지, 영상 등과 같은 용량이 많이 필요한 데이터들을 사용하고 싶을 때는 NSCache보다 URLCache쪽이 더 적절하겠다. 

 

https://developer.apple.com/documentation/foundation/nscache

 

NSCache | Apple Developer Documentation

A mutable collection you use to temporarily store transient key-value pairs that are subject to eviction when resources are low.

developer.apple.com

https://developer.apple.com/documentation/foundation/urlcache

 

URLCache | Apple Developer Documentation

An object that maps URL requests to cached response objects.

developer.apple.com

https://github.com/apple/swift-corelibs-foundation/blob/main/Sources/FoundationNetworking/URLCache.swift

https://github.com/apple/swift-corelibs-foundation/blob/main/Sources/Foundation/NSCache.swift

https://developer.apple.com/documentation/foundation/nsurlrequest/cachepolicy/useprotocolcachepolicy

 

NSURLRequest.CachePolicy.useProtocolCachePolicy | Apple Developer Documentation

Use the caching logic defined in the protocol implementation, if any, for a particular URL load request.

developer.apple.com

https://tech.justeattakeaway.com/2021/02/01/urlcache-default-size-is-not-enough/

 

URLCache – Default size is not enough – Tech Blog

Even though networks are getting faster every day, the amount of data transferred between your device and the cloud is also increasing. Here at Just Eat, we always aim to write reliable, and efficient code that results in fast, problem free transactions. H

tech.justeattakeaway.com