안드로이드 앱 개발하실 때 어떤 비트맵 캐쉬 라이브러리를 사용하시나요?
지금 회사 오기전에는 UIL부터 Picasso까지 써보았는데요. 처음 입사했을 때 큰 회사인데도 불구하고 앱의 bitmap 캐쉬 관리가 엉망이어서 Picasso를 적용하려 했었죠. 소스 코드 분석하고 그러던 중 갑자기 여러 이슈가 떨어져서 앱의 문제점만 분석한 문서만 만들어 놓았는데.. 몇 개월 후 입사하신 다른 분이 Glide를 소개해 주셔서 Glide를 제 개인 샘플앱에도 적용해보았습니다. 회사 앱에 적용은 다른분이 하셨다능.. 구글링 해보면 Picasso와의 벤치마킹은 Glide가 여러면에서 압승이었습니다.
(Square에서 Picasso 업그레이드 하려는 움직임을 보이는 것 같은데... 차후에 두 라이브러리의 대결이 궁금하네요ㅋㅋ)
여러 상품의 이미지를 앱에서 노출해야 하는데, 간혹 서버에서 이미지 URL 변경없이 이미지를 변경하는 경우가 있는데, 앱에는 캐쉬된 이전 이미지가 계속해서 나타나는 경우가 있죠. 저 같은 경우 Glide가 알아서 처리 해준다고 착각했었습니다. 혹시나 해서 Glide측에 문의 해보니 아니나 다를까 제가 기대한 cache invalidation은 없었습니다. (https://github.com/bumptech/glide/issues/996 참조)
저희 회사의 고객 서비스 센터에서 안드로이드는 최신 이미지가 정상적으로 노출된다 길래 okhttp에서 알아서 처리하나 추측했지만 아무리 봐도 Glide와 okhttp 연동에는 그런 작업이 없길래 도저히 안되겠다 싶어 제가 직접 확인해 보았는데, 역시나 HTTP 통신을 okhttp를 쓰도록 세팅하고 bitmap cache는 Glide로 하더라도 최신 이미지가 노출되지 않더라구요.
제가 기대한 건 각 이미지의 ETag를 conditional GET request의 If-None-Match 헤더에 태워 보내서 서버에서 이미지가 변경되면 변경되었다고 응답하고 변경 안되면 안되었다고 응답하여 그 응답을 라이브러리 단에서 처리하여 포워딩 캐쉬가 되는 거였는데... 아무래도 conditional request 보내는 것도 적으면 몇 ms, 많으면 몇십, 몇백 ms가 걸릴수도 있어서 이를 피하기 위해 memory, disk 캐쉬 hit이 발생하면 바로 바로 캐쉬된 이미지를 가져다 뿌려주는 것으로 보입니다.
그러면 사용자에게 가장 최신의 이미지만을 노출하고 싶은데, 어떻게 해야할까요?
결론부터 말하면 이미지가 바뀌면 그 이미지 리소스를 가리키는 URL도 변경해서 클라이언트에 내려주면 된다입니다. Glide에서 cache invalidation을 위해 StringSignature라는 것을 제공하지만 이보다는 서버쪽에서 이미지가 변경되면 이미지 리소스에 대한 URL도 변경되도록 처리하고 이를 클라이언트가 전달 받아 뿌려지도록 하는 구조가 맞을 것 같습니다. 그러면 클라이언트측에서는 디스크, 메모리 캐쉬를 사용하여 앱 속도를 보장하면서 항상 사용자에게는 최신 이미지를 노출할 수가 있습니다.
'android' 카테고리의 다른 글
Android N Preview 대응 (0) | 2016.06.04 |
---|---|
RecyclerView에 Endless Scrolling(무한 스크롤)을 구현해 보자 (0) | 2016.03.23 |
ButterKnife를 왜 쓰냐구요? (0) | 2016.02.29 |
뭐? 이벤트? 버스 태워 보내! #2 (0) | 2016.02.29 |
뭐? 이벤트? 버스 태워 보내! #1 (0) | 2016.02.29 |