[ANDROID 문제해결] 이미지 캐시
당근마켓과 비슷한 앱을 한번 만들어보고 있던 와중, 이미지 클릭 시 크기가 큰 이미지로 다시 보여줘야 했다. 큰 이미지로 다시 보여주기 위해 이미지를 클릭하면 Activity 하나를 띄우고 새로운 Activity 에 ImageView 하나를 띄워 이미지를 보여줄 생각이었다.
다만, 이미지는 서버에서 가져오는 작업이라는게 문제였다. 뭐, 원래 Activity 에서 서버작업으로 이미지 가져오고 이미지 클릭을 했을 때도 서버작업을 통해 이미지를 가져와도 이미지를 보여줄수는 있겠지만.. 네트워크 작업이라는게 리소스도 많이 차지하고 성능저하도 이뤄질게 뻔하기에 그다지 바람직하지 않은 방법이었다.
그래서 이미지 캐시를 이용해서 보여주려 한다. 알아보니 LRU 알고리즘을 이용한 안드로이드 내장 객체로 LruCache 가 있는 모양이다. 이미지를 처리할 때는 LruCache 보다는 메모리 관리도 자동으로 해주며 성능까지 최적화 시켜주는 Glide 가 더 효과적이라고 한다. LruCache 는 추후에 이미지보다는 좀 더 간단한 캐시 기능이 필요할 때 한번 사용해보는걸로 하자.
Glide 는 다음과 같은 절차로 이미지 캐시를 지원한다고 한다.
메모리랑 디스크를 한번씩 거쳐서 기존의 서버에서 가져온 이미지가 있는지 확인하고 있으면 로컬에서 없으면 서버에서 다시 가져오는 형태인듯 하다. 그렇군..
그러면 Glide 를 이용해서 캐시에 저장하고 캐시에 저장된 이미지들을 사용하면 되겠다. 일단 그 전에 궁금하니까 이미지를 불러올 때 그 크기가 얼마인지부터 확인해보자. Glide 에서 이미지가 로드될 때, 리스너를 붙여서 이미지 사이즈를 알아보았다.
94kb 정도로 크지 않았다. 실제 서버에 저장된 크기는 190kb 정도였는데 아마 glide 가 서버에서 가져오면서 크기를 좀 줄이는게 아닐까 싶다.
그러면 이제 glide 를 이용해서 캐시 저장을 해보자. diskCacheStrategy() 을 이용하면 캐시 작업이 가능하다고 한다. diskCacheStrategy 을 이용해서 캐시 작업을 안하거나, 원본을 얻어오거나 이미지 처리가 된 리소스를 얻어오는 등의 옵션을 추가할수도 있다.
원래 블로그 작성을 하면서 Glide 를 적용해보고 있었는데, 알아보니까 Glide 자체에 캐시 기능이 자동으로 설정되있다고 한다... 기본 캐시 옵션이 diskCacheStrategy(DiskCacheStrategy.AUTOMATIC) 이라서 자동으로 캐시 기능이 활성화 되어있는 상태였다. 그래서 같은 서버 주소에서 받아오는 이미지라면 이미 캐시에 저장이 되어 캐시에서 이미지를 가져오고 있던 상황. 따로 설정해줄 필요가 없었다. 뭔가 아쉽네. 조만간 LruCache 를 이용한 캐시 작업을 빨리 해봐야겠다.
이번 예제에서는 캐시에 저장되는 이미지의 크기가 크지 않았지만, 만약에 크기가 큰 이미지가 있었다면 캐시 사용에 문제가 생겼을 확률이 높다. 그러기 위해 캐시에 사용할 메모리의 크기를 초기화 시켜주는 작업도 할 수 있는데, 추후에 다시 알아보자.