brunch

You can make anything
by writing

C.S.Lewis

by Noah Dec 17. 2020

이미지 로더 만들기

그게 왜 자꾸 만들어 오라고 하지?

카테고리 : 안드로이드, 비동기, 네트워크, UI

난이도 : 중

질문자의 의도 

이미지는 모든 서비스에서 폭 넓게 사용해주고 있다. 

요즘은 Glide 와 같은 라이브러리가 모든 것을 알아서 다 해주고 있지만, 그 안에는 파일 캐시, 메모리 캐시, 비트맵 가공, 비동기 처리 까지 다양한 기술이 사용되고 있다.

대부분 문제를 낼 때는 라이브러리를 사용해도 된다고 하지만, 어렵게 문제를 낼 때는 라이브러리를 직접 구현해라고 할 수도 있다. 

과제를 통해서 이미지 다운로딩, 비동기 처리, 이미지 리사이징, 파일캐시, 메모리 캐시, 파일명(난수 생성), 로딩 캔슬 등을 질의할 수 있다.


Q. 이미지 로더를 만드셨는데(또는 사용하였는데) 이미지 로더의 동작 순서에 대해서 설명해 보세요.

이미지 로딩 요청 -> 메모리 캐시에 존재 여부 확인 -> 디스크 캐시의 존재 여부 확인 

메모리 캐시에 있으면 바로 사용

디스크 캐시에 있으면 사용하고 메모리 캐시에 저장한다.

없으면 해당 위치 (로컬 또는 웹) 로 부터 다운로드 한다.

다운 받은 이미지 Bitmap 으로 바꾸고 Target 에 맞게 이미지를 리사이징한다.

메모리 캐시, 디스크 캐시에 저장한다.


동작 순서를 알면서도 한 번에 매끄럽게 설명하기가 힘들다. 일렬의 과정을 순서에 맞게 설명해야 한다.

크게 캐시에 존재 여부를 확인하여 로딩하고 다시 캐시에 저장하는 과정과 다운로드 한 이미지를 리사이징하고 뷰에 보여지는 방법에 대해서 질문을 하게 된다.


추가적으로 디스크 캐시 & 메모리 캐시, Lru 캐시에 대한 질문과 Bitmap 조작, 이미지를 업데이틑 하는 시점 과 쓰레드를 물어볼 것이다.

그리고 RecyclerView 의 holder 의 존재 유무에서 이미지 로딩시 요청한 holder 의 유/무를 어떻게 판단하는지도 질의하게 된다.


Q. 캐시를 사용하였는데 캐싱에 대해서 설명해 보세요

데이타의 접근 하는 시간을 단축 하고자 메모리/디스크에 동일한 데이타를 넣어두고 실제 데이타 요청을 받았을 때 접근 속도고 빠른 순으로 데이타의 존재 유무를 확인하여 데이타를 가져오는 기법입니다.

메모리 > 디스크 > 실제 데이타 순으로 빠름

한정적인 메모리, 데이타 공간의 관리가 필요하다.


Q. Lru Cache 란

가장 오래 사용되지 않은 것을 대체하는 알고리즘이다.

Lru 알고리즘은 캐싱 알고리즘으로 많이 사용된다.

안드로이드에는 LruCache, DiskLruCache가 있다.


Q. 큰 비트맵을 로딩 하는 방법

sampling size 를 활용한다.

https://developer.android.com/topic/performance/graphics/load-bitmap?hl=ko


Q. recycler view 에서 이미지 로드 후 요청한 holder 가 다른 holder 로 변했는지를 확인하는 방법

holder 에 tag 로 요청한 url 을 set 해두고 이미지의 결과가 왔을 때 tag 값과 실제 요청한 url 을 비교하여 확인한다.

Glide 의 내부에도 Tag 를 사용하고 있어서 실수로 holder 의 tag 에 다른 데이타를 사용하면 안된다.



참고할만 한 자료 

캐싱 비트맵 : https://developer.android.com/topic/performance/graphics/cache-bitmap

안드로이드 이미지 로더 : https://d2.naver.com/helloworld/429368

bitmap, view holder pattern 

디스크 캐시를 활용 할 때 디바이스 디스크가 현저히 적으면?

565, 8888 포멧

쓰레드 관리

오리지날과 스케일링 이미지 관리 방법

매거진의 이전글 Process, Thread 차이가 뭐예요?
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari