개념
Caching은 저장한다는 뜻, 캐시는 임시 저장소라고 할 수 있다. 추상적인 개념으로 소프트웨어적, 하드웨어적으로 캐시를 구현할 수 있다
컴퓨터구조에서의 cache
CPU와 메인 메모리 사이의 속도 차이를 완충하기 위해서 중간에 메인 메모리의 데이터를 미리 복사해두는 임시적인 메모리
디스크, GPU 등등 여러 곳에서 cache를 둠으로써 장치들 간의 속도 차이를 완충하고 있다
네트워크 환경에서의 cache(Web Cache, HTTP Cache)
Client-side caching
좁은 의미로 브라우저 캐싱이라고도 한다
브라우저에 의해 만들어진 폴더에 서버로부터 받은 데이터를 저장한다
다음에 부라우저를 켜면 서버로부터 데이터를 다시 받아오지 않고, 로컬의 해당 폴더에 있는 데이터를 활용한다
Server-side caching
Client 에서 자주 들어오는 Request에 해당하는 정보를 매번 디스크로부터 가져오기에 부담이 되기에, Server 컴퓨터의 메모리에 Caching 해두는 방법이 있다
자주 들어오는 정보들만 저장하는 Cache Server를 운영할 수도 있다
디스크 캐시 → 하드 디스크에 저장
메모리 캐시 → 메인 메모리에 저장
임시적인 데이터
자주 업데이트 되는 데이터
작은 사이즈의 데이터
예시: NSCache의 wrapper를 통해 NSCache인스턴스를 배열로 관리하는 경우
클라이언트-서버
캐시로 구분할 수 있을 것 같음ex) 넷플릭스 중계 서버를 통해 데이터를 가져갈 수 있게 구현하기도 한다.
힙 영역에 저장할 수 있다
근거: 공식 문서 내 discardContentIfPossible()
Called to discard the contents of the receiver if the value of the accessed counter is 0
-> 참조 횟수가 0이 되면 실행되는 함수가 있는 것으로 보아, 캐시가 참조되는 친구임을 유추할 수 있을 것이라고 예측함
NSCache.
Apple에서 제공되는 기능으로 캐싱과 관련될 때 사용된다. 데이터를 Key-Value로 저장하는 컬렉션으로 캐싱된 데이터가 너무 많은 메모리를 사용하면 시스템에서 자동으로 캐시된 메모리를 삭제해준다
이미지가 memory cache(NSCache) 에 있는지 한다.
만약에 이미지가 없다면?
disk cache(UserDefault 혹은 기기 Directory에 있는 file 형태)에서 확인하고
있다면 memory cache에 추가해주고 다음에는 더 빨리 가져 올 수 있도록 할 수 있다
만약 없다면?
서버 통신을 통해서 받은 URL로 이미지를 가져와야 한다
이때 서버통신을 통해서 이미지를 가져왔으면 memory와 disk cache에 저장해줘야 캐시처리가 될 것이다
메모리 캐싱 :
private let imageCache = NSCache
imageCache.setObject(image, forKey: url.lastPathComponent as NSString)
디스크 캐싱 :
guard let path = NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true).first else {
return
}