[Android][Java] Glide 사용하여 이미지 보여주기, 메모리 디스크 캐싱 이란뭘까 ?

안녕하세요 무너발이다. 자주 사용하게될것같아서 glide에 대해 공부하면서 동시에 등장하는 용어에 대하여 공부해볼생각이다.

 

이글말고 공식문서로 보실분들은 github 링크를 남겨드리니 READ.me에 있는 공식문서를 확인하십시오 !! 

저는 비전공자이고 professional 하지못해 최대한 제 말로 이해하려고 노력하는사람입니다... 

틀릴수도있으니 항상 cross check 하시면 좋아요. 

 

https://github.com/bumptech/glide

 

GitHub - bumptech/glide: An image loading and caching library for Android focused on smooth scrolling

An image loading and caching library for Android focused on smooth scrolling - bumptech/glide

github.com

 

1.  사용하는이유 

 

애버핏 개발중 코치 회원가입시 등록한 프로필사진을 보여줘야하기 때문!! 

 

동작 예상 ? 

1. 갤러리에서 사진을 불러와서 임시로 안드로이드 ImageView에 저장해야한다.

2. 이미지를 프로필사진으로 저장한다면 서버에 이 사진을 보내줘야한다.

3. 서버에서는 이사진을 파일 등으로 보관하고 호출시 불러올수있도록 url을 만들어 db에 저장해야한다.

 

2. Glide란 ? 어떤기술을 쓰는건데 ?? 

 

Glide는 미디어 디코딩, 메모리 및 디스크 캐싱, 리소스 풀링을 간단하고 사용하기 쉬운 인터페이스로 래핑하는 Android용 빠르고 효율적인 오픈 소스 미디어 관리 및 이미지 로딩 프레임워크입니다.

 

-> 모르는 단어가 너무 많이나와버렸다. 디코딩 ok  메모리, 디스크 캐싱 ?, 리소스 풀링 ? 

 

미디어 디코딩은 인코딩된 이미지를 디코딩해준다는것일것이고 

메모리 디스크 캐싱은 무엇일까? 간단하게 동료 gpt님께 물어보았다. 

cahce는 네이버사전에 !! 

 

캐시란 ?

캐싱(cache) : 반복적인 데이터 접근 빠르게하기위해 데이터 사본 임시로 저장하는것 

-> 은닉처 처럼 저장공간이아닌 곳에 넣어두는것을 의미한다는것같다. 이유는 자주쓰니까(가져오거나, 계산하거나)!! 

 

메모리 캐싱 

로드된 이미지를 메모리에 저장하는것 즉 RAM에저장한다 = 실행되고있는 동안 유지된다.

디스크 캐싱

로드된 이미지를 디스크에 저장한다. 안드로이드의 경우 앱 내부저장소 내의 캐시디렉토리에 저장 = 삭제하기전까지 유지된다. 

 

glide에서는 설정할수있지만 기본적으로 메모리, 디스크 캐시에 모두저장한다. (설정등으로 수정할수있다)

그리고 불러올때 메모리캐시에 있는지 조회 후 없다면 디스크캐시를 조회하여 로드한다.

오래된 데이터를 삭제하는것도 알아서 잘한다고한다. 

 

 

간단한 사진으로 이해해보아요 !! 

 

사진을 저장(업로드)할때 

고양이를 저장하고파

 

사진을 불러올때(로드)할때 

 

 

즉 사진을 메모리,디스크,서버에 모두 저장하고 사진을 불러올때 메모리,디스크,서버순서로 접근하여 불러온다는것이다.

필요에따라 메모리,디스크 아니면 아예 서버에만 저장할수있겠죠 

재사용성을 염두에두고 설정하시면 될듯합니다.

 

 

비트맵 풀링 이란 Bitmap Pooling

 

pool 이란

 

이미지처리를 위해 한 번 사용된 비트맵 객체를 다시 사용할 수 있도록 관리하는 기법이다.

일반적으로 자바의 가비지 컬렉터는 메모리에서 해제된 데이터를 수거하는데

비트맵풀링은 이런 비트맵 객체를 풀에 저장해두고 동일한 크기 또는 유사한 크기의 비트맵이 필요할 때 이를 다시사용한다.

 

비트맵 객체 : 이미지를 담는 액자라고 생각하면쉽다. 해상도가 큰 이미지는 큰 비트맵객체가 필요할것이고 작은 이미지라면 작은 비트맵객체가 필요하게된다.

 

하지만 안드로이드 특성상 image View는 크기를 정해두기때문에 비트맵객체를 재사용할일이 많게되고 이를 재생성하기보단 재활용하기 위한 기술이 비트맵 풀링이라고 이해했다.

 

어떻게 동작하니 

 

1. 비트맵 사용: 이미지를 로드할 때 Glide는 먼저 적절한 크기의 비트맵 객체를 비트맵 풀에서 찾습니다.

2. 비트맵 반환: 이미지 처리가 끝나면 비트맵 객체는 다시 풀에 반환됩니다.

3. 새로운 비트맵 생성: 만약 비트맵 풀에 필요한 크기의 비트맵 객체가 없다면, 새로운 비트맵 객체를 생성하고 이 객체는 사용 후 풀에 반환됩니다.

 

 

또다시 나타난 사진의 시간 

 

 

초해상도용 그림을 보여주기위해선 초 고해상도용 액자가 필요합니다. 제가그린 그림은 다이소 액자로 해결이 되구요 

이때 전시를 하기위해 필요했던 액자를 버리지 않고 모아두는겁니다. 그리고 또다른 초 고해상도 그림을 전시할때에는 초고해상도용 액자를 다시 사용하구요, 다시 내가그린 그림을 전시하고싶을때에는 다이소 액자를 다시 꺼내서 쓰는겁니다.

 

사실 이건 이해하기 어렵지 않은데 그냥 그려보았습니다. 

 

즉! 비트맵폴링은 자동으로 되는거니 신경쓸것이 없고 이미지를 서버에 저장할때 자주 쓸 이미지라면 메모리,디스크에도 저장할수있으며

메모리->디스크->서버 순으로 조회하여 있다면 로드 하는 기술이 적용된 라이브러리이다.

서버에 요청하지 않아도 되니 당연히 서버의 부하를 줄여주고, 메모리에서 불러온다면 더 빠르게 로드가 가능하다.

사용하기 편하게 만들어진 메서드들은 덤 !!! 

 

3. 사용방법 ! 

 

1) 의존성 추가

dependencies {
  implementation 'com.github.bumptech.glide:glide:4.16.0'
}

 

2) 매니페스트에 권한 인터넷 권한 추가 (http 요청이 있기때문 volley, okhttp,등등 모두 지원한다. )

    <uses-permission android:name="android.permission.INTERNET" />

 

3)