적당한 고통은 희열이다

- 댄 브라운 '다빈치 코드' 중에서

Swift iOS 앱 개발/실전 Swift

[Swift iOS] 이미지 캐시 처리 Memory vs. Disk

hongssup_ 2023. 4. 24. 09:59
반응형

앱에서 사용되는 이미지가 많을 경우, 이미지를 매번 서버로부터 받아오면 로딩 속도도 오래걸리고 계속 네트워크 통신을 해주는 것도 리소스 낭비이기 때문에 이미지를 캐싱하는 작업을 해보았다.

 

이미지 캐싱이란? 

다운로드된 이미지를 캐시(메모리 or 디스크)에 저장해두었다가 불러오는 방식으로, 

다운받은 이미지는 별도의 리소스를 소모할 필요 없이 빠르게 가져와서 보여줄 있다. 

 

물론 KingFisher SDWebImage 같은 이미지 라이브러리를 사용하면 이미지 다운로드 및 캐싱을 알아서 자동으로 처리해주고, 이미지를 메모리에 저장하는 대신에 디스크에 저장하고 필요한 만큼만 메모리에 올려서 사용하기 때문에 메모리 사용량도 줄이고 편하게 구현해줄 수 있다. 

그치만 직접 구현 한번 해보자고...! 

 

iOS에서 이미지 캐시 처리를 하기 위해 다음 2가지 방법을 사용할 수 있다. 

1. Memory Cache 

메모리 영역을 이용한 캐싱

NSCache를 통해서 사용 가능

처리 속도가 빠르지만 저장 공간이 작다?

앱을 종료하면 캐시에 저장된 내용도 함께 사라진다.

2. Disk Cache 

데이터를 파일 형태로 디스크에 저장

캐시에 저장할 데이터를 기기 내부에 아카이빙하는 방식으로, 앱을 껐다 켜도 데이터가 사라지지 않고 남아있다. 

FileManager를 통해 사용 가능 (파일 경로에 이미지를 저장하면 앱이 삭제되어도 캐시가 남아있게 됨)

앱이 차지하는 용량이 커질 수 있음.. 

 

 

먼저 NSCache를 사용해서 메모리에 이미지 캐시 처리를 해보았다. 

오 잘된다! 

작동은 잘 되는데 고작 이미지 90개 받아오는데 메모리 사용량이 3기가가 넘어버렸다.. 헤헿...😅

이미지가 커서 메모리를 많이 잡아먹으면 메모리 부족으로 앱이 죽어버리는 경우가 생기는데

이러한 문제를 해결하기 위해 다운받은 이미지 크기를 줄이고, 디스크로 캐싱하는 방법을 사용해보기로 했다. 

 

음 그런데 디스크에 저장해서 메모리 과부하를 막고 싶긴 한데, 

굳이 앱이 종료되어도 캐시가 남아있기를 바라진 않는데...🤔

 

FileManager의 temporaryDirectory 를 사용하면 어떨까? 하는 생각을 해보았다. 

임시 디렉토리에 저장하게 되면 메모리 사용량은 줄이고 앱이 종료되면 디스크에 캐시된 데이터도 함께 사라지지않을까.

gpt 한테 물어보니 이렇게 답해주긴 했는데,,, 

시뮬레이터 돌려서 디버깅해보니까 앱 종료하고 다시 켜도 왜 캐시된 이미지를 불러오는 것인가.. 

지피티 너어…?!? 확실한고니???

근데 파일앱에 들어가면 딱히 저장된 파일은 업숨.. 뭐지..? 흐음.. 이부분은 더 찾아봐야겠당

 

 

아무튼 이미지 크기 resizing 해서 줄이고 FileManager 사용해서 디스크 캐시 처리를 해주었더니 

로딩되는 이미지 개수와 상관없이 메모리 사용량이 평균 60메가 정도로 현저히 줄었다는 걸 확인할 수 있었다. 

728x90
반응형