프로젝트 유지보수 중 사수님이 이미지 캐시 관련 로직을 구현하시다가 나에게 이미지 캐시에 대해 설명해주셔서 까먹기 전에 살짝쿵 정리하고 가기로 했다. 실제로 캐시에 대한 개념을 개발자가 알고 있는 게 중요하기도 하고, 의외로 면접 단골 질문이라 미래를 위해서 (?) 이해하고 있는 게 도움이 될 것 같다.
https://motosw3600.tistory.com/37
위 블로그가 사수님이 간결하게 잘 정리 된 것 같다고 공유해주신 블로그! 이고, 위 블로그 글과 공식문서, 그외 다른 레퍼런스를 참고해서 정리했다.
iOS에서 이미지를 캐싱하는 방법은 크게 3가지로,
1. 메모리 캐시
2. 디스크 캐시
3. URL 주소 캐시
가 있다.
세 가지 중 메모리 캐시와 디스크 캐시에 대해서만 정리할 예정이다. 아무래도 3은 alamofire로 간편하게 할 수 있어서...!
✔︎ 이미지 캐시?
메모리 캐시 -> 디스크 캐시 순으로 일어나게 되는데, 메모리 캐시에서 메모리 유무를 먼저 확인 하고, 없으면 디스크 캐시에서 메모리 유무를 확인한다. 이때 디스크에 해당 메모리가 있으면 메모리에 저장 후 캐싱을 하고, 없으면 네트워크 통신을 통해 이미지를 가져온다 한다.
이미지 캐시는 왜 할까-에 대해 고민을 안 해볼 수가 없다.
이미지 캐시를 사용하는 가장 큰 이유는 네트워크 호출 관리이다.
예를 들어, 테이블뷰나 컬렉션뷰처럼 사용자의 스크롤 액션에 따라 이미지 로딩을 위한 네트워크 요청을 하는 경우가 생긴다. 매번 이미지를 불러오기 위해 네트워크를 호출하는 것보다 Cache를 통해서 저장한 이미지의 URL을 가져와 API를 한 번만 호출하도록 하여 보다 효율적으로 네트워크 통신을 할 수 있다.
즉, 이미지 캐싱을 하면 비효율적인 네트워크 사용을 줄여 이전에 불러왔던 이미지를 캐싱을 통해 빠르게 불러올 수 있다는 장점이 있기에 사용한다.
✔︎ 메모리 캐시
iOS에서 메모리 캐시를 사용할 경우 NSCache를 사용하게 된다. 공식 문서의 설명을 따르자면, 임시로 key-value 값으로 저장하는 특징이 있다. 메모리 영역의 일부를 캐싱 하는 데에 사용한다. 또한, thread-safe해서 캐시 할때 무언가 더 해줘야할 필요가 없다.
앱이 종료되면, 메모리에서 리소스가 해제되면서 캐시된 리소스도 사라진다는 단점이 있다.
✔︎ 디스크 캐시
디스크 캐시의 가장 큰 특징은 아무래도 FileManager를 사용한다는 점인 것 같다.
데이터를 파일 형태로 디스크에 저장한다. 주로 UserDefaults나 CoreData 사용할 때 사용하게 된다. 앱이 종료 되면 리소스가 사라지던 메모리 캐시와는 달리 캐시된 리소스가 사라지지 않는다. 그래서 반복적으로 디스크 캐시를 하게 되면 앱에서 사용되는 용량이 커지게 되기 때문에 주의해야 한다.
https://developer.apple.com/documentation/foundation/nscache