ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • NSCache vs URLCache
    iOS 2022. 8. 1. 10:25

    안녕하세요. 그린입니다🟢

    이번 포스팅에서는 오랜만에 간단한 주제인 NSCache와 URLCache의 차이를 알아보려고 합니다🙌

    그럼 본론으로 바로 들어가시죠!

     

    우선 둘다 Cache라는 개념에서는 동일할거에요.

    그럼 Cache가 뭔지 간단히 살펴볼까요?

     

    Cache란?

    캐시의 정의는 데이터나 값을 미리 복사해 놓는 임시 장소를 말합니다.

    캐시는 캐시의 접근 시간에 비해 원래 데이터를 접근하는 시간이 오래 걸리는 경우 혹은 값을 다시 계산하는 시간을 세이브 하고 싶은 경우에 사용됩니다.

    캐시에 데이터를 미리 복사해 놓으면 계산이나 접근 시간 없이 더 빠른 속도로 데이터에 접근할 수 있습니다.

    그럼으로 캐시는 시스템의 효율성을 위해 여러 분야에서 두루 쓰이고 있습니다.

    이것이 캐시의 정의입니다.

    iOS에서 사용되는 캐시는 2종류로 메모리 캐시와 디스크 캐시가 있습니다.

    앞으로 알아볼 NSCache가 이 메모리 캐시 방식이라고 보면 됩니다.

    URLCache는 메모리/디스크 캐싱 모두 선택적으로 가능합니다.

    혹시 캐시에 대해 조금 더 궁금하시다면..! 이 포스팅을 참고해주세요🙌

    https://green1229.tistory.com/57

     

    Cache

    안녕하세요. 그린입니다! 이번 포스팅에서는 Cache (캐시)에 대해 알아보겠습니다.✍️ 1. 캐시란 ?? : 캐시(cache)는 데이터나 값을 미리 복사해 놓는 임시 저장소를 말한다. -. 역할 및 장점 : 기존방

    green1229.tistory.com

     

    그럼 캐시가 어떤건지 파악했겠다.. 이제 정말 찐 본론으로 가시죠ㅎㅎ

    우선 NSCache와 URLCache가 어떤건지부터 공식문서를 통해 정의를 파해쳐보겠습니다.

    두가지 모두 애플에서 기본적으로 Foundation 프레임워크에서 제공해줍니다.

     

    NSCache?

    앞에서 잠~깐 스치듯 말했지만 NSCache는 인메모리 캐싱 방식입니다.

    공식문서의 정의는 리소스가 부족할 때 제거될 임시 키와 값으로 저장되는 변경가능한 컬렉션이라고 소개되어 있어요.

    class NSCache<KeyType, ObjectType> : NSObject where KeyType : AnyObject, ObjectType : AnyObject

     

     

    NSCache의 특징

     1. NSCache는 시스템 메모리를 과도하게 사용하지 않도록 다양한 자동 제거 정책이 있습니다.

     즉 다른 프로그램에서 메모리가 필요한 경우 이런 정책들이 캐시에서 일부 항목을 제거하고 메모리 사용 공간을 최소화합니다.

     2. 캐시를 직접 잠그지 않아도 다른 스레드에서 캐시 항목을 추가/제거 및 쿼리할 수 있습니다.

     3. 객체와 달리 캐시는 캐시에 저장된 키 객체를 복사하지 않습니다.

    이 토대로 정리해보자면 NSCache는 이럴때 주로 사용됩니다.

    매번 계산 및 만드는데 코스트가 많이 드는 데이터가 있는 객체를 NScache를 통해 메모리 캐싱하여 임시로 저장합니다.

    이 개체를 재사용하면 해당 값을 다시 계산할 필요가 없기에 성능상의 이점을 가집니다.

    그러나 이 개체는 응용 프로그램에 중요치 않고 메모리가 부족하다고 판단되면 자동으로 삭제됩니다.

    또한 앱을 끄거나 하는 등이 발생하면 마찬가지로 자동 삭제 됩니다.

    그렇기에 데이터의 크기에 맞춰 크기를 할당해줍니다.

     

    그럼 다음으로 URLCache의 개념을 보시죠!

     

    URLCache?

    URLCache는 인메모리/디스크 방식 모두 가능한 캐싱 방식입니다.

    URL 요청으로 캐시된 리스폰 개체에 매핑합니다.

    즉 이름에서도 나와있듯이 URL 요청이 방법이죠.

    공식문서의 정의는 아래와 같습니다.

    class URLCache : NSObject

     

    URLCache의 특징

    URLCache 클래스는 개체를 URLCache에 매핑해 URL 로드 요청에 대한 응답 캐싱을 구현합니다.

    앞서 말했듯 메모리와 디스크 상 복합 캐시를 제공할 수 있으며 이 두 부분의 크기를 모두 제어할 수 있습니다.

    또한 캐시 데이터가 지속적으로 저장되는 경로도 설정해줄 수 있습니다.

    다만 iOS에서 온디스크 캐시는 앱이 실행되지 않을때에 시스템의 디스크 공간이 부족한 경우 제거될 수 있습니다.

     

    URLCache의 Thread Safe

    iOS 8.0 / macOS 10.10 이상에서는 URLCache는 Thread Safe합니다.

    URLCache 인스턴스 메서드는 동시에 여러 실행 컨텍스트에서 안전하게 호출될 수 있지만 동일한 요청에 대한 응답을 읽고 쓸때 race condition이 발생할 수도 있습니다.

    그럴경우 URLCache의 서브클래스는 스레드로부터 안전한 방식으로 재정의된 메서드를 구현해야 합니다.

    재정의가 필요한 메서드는 아래와 같이 나눌 수 있습니다.

     

    - Save Response

    기존 URLRequest로 되어있는 아래와 같은 메서드 사용이 있었습니다.

    func storeCachedResponse(
        _ cachedResponse: CachedURLResponse,
        for request: URLRequest
    )

    이를 추가로 아래와 같이 재정의합니다.

    func storeCachedResponse(
        _ cachedResponse: CachedURLResponse,
        for dataTask: URLSessionDataTask
    )

    - Get Response

    func cachedResponse(for request: URLRequest) -> CachedURLResponse?

    기존 응답을 얻기위해선 위와 같은 메서드를 이용했다면 이제는 아래와 같이 정의해줘서 사용합니다.

    func getCachedResponse(
        for dataTask: URLSessionDataTask,
        completionHandler: @escaping @Sendable (CachedURLResponse?) -> Void
    )

    - Delete Response

    기존 응답 삭제를 위해서 아래와 같이 사용했습니다.

    func removeCachedResponse(for request: URLRequest)

    URLRequest 타입 사용에서 재정의 시 아래와 같이 URLSessionDataTask 타입으로 변경됩니다.

    func removeCachedResponse(for dataTask: URLSessionDataTask)

    즉 Save, Get, Delete 모두 재정의 시 특징은 추가적인 data task 작업을 할 수 있도록 변경되는 점입니다.

     

    자 그럼 NSCache와 URLCache가 무엇인지를 알아보았고 어느정도 어떤 차이가 있는지 알아보는 과정에서 이미 파악되었을거라 생각합니다.

    그렇기에 이 차이를 바탕으로 어떤 기준으로 뭘 쓰는것이 더 괜찮은지에 대해 얘기해보는것이 좋을것 같습니다.

     

    NSCache vs URLCache

    어떻게 보면 확연히 드러날 수 있는 가장 큰 차이는 온디스크 방식의 캐싱을 지원하느냐로 볼 수 있을것 같아요.

    캐싱을 한다는것은 어떻게 보면 대표적으로 서버 통신을 통해 받아온 데이터들이 있을것이고 그 중에 이미지라는 친구들의 데이터 크기는 다른 타입보다 클거에요.

    그런 데이터들이 정말 많다고 가정한다면 인메모리 방식으로는 한계가 있을것이에요.

    RAM은 드라이브보다 빠르긴 하지만 상대적으로 적게 저장될 수 있기 때문이죠.

    즉 이미지, 음성, 영상들의 데이터를 저장하기에는 URLCache쪽이 더 적절하지 않을까 생각합니다.

    이 둘의 차이는 당연히 인메모리 vs 온디스크 캐싱 방식에서 비롯되었다고 생각합니다.

    물론 이미지의 데이터들이 있어도 무리되지 않는다면 속도가 더 빠른 인메모리 캐싱 방식으로 사용되어도 무방하죠.

    URLCache는 이 둘다 지원해주기에 NSCache와 URLCache 사용에서 이 사항은 크게 걸림돌이 안된다고 생각합니다.

    정리해보자면 저는 네트워크 통신으로 데이터를 관리해준다는 가정에서는 URLCache쪽을 선호하긴 하는 편인것 같네요.

    인메모리와 온디스크를 커스텀하게 정의할 수 있기에 모든 사항을 아우룰 수 있지 않을까합니다.

     

    마무리

    오랜만에 iOS 기본 프레임워크에 속한것을 알아봐서 재밌었습니다!

    막연히 사용하던게 조금 정제된 느낌..?

    기초가 조금 부족해진것 같아 조금씩 바로 잡으려는 목적의 첫번째 포스팅이였습니다!

     

    [참고자료]

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

     

    Apple Developer Documentation

     

    developer.apple.com

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

     

    Apple Developer Documentation

     

    developer.apple.com

    https://ko.wikipedia.org/wiki/캐시

     

    캐시 - 위키백과, 우리 모두의 백과사전

    위키백과, 우리 모두의 백과사전. 동적 CPU 메모리 캐시 그림 캐시(cache, 문화어: 캐쉬, 고속완충기, 고속완충기억기)는 컴퓨터 과학에서 데이터나 값을 미리 복사해 놓는 임시 장소를 가리킨다.

    ko.wikipedia.org

Designed by Tistory.