Android Glide에 대하여

Jong_Han·2022년 1월 11일
1

Glide

Glide란, Android에서 추천하는 이미지 로드 라이브러리 입니다.

이미지 로드 라이브러리는 보다 쉽게 이미지를 로드 하고 더 나아가서는 이미지 캐싱 까지 해주는 편리한 라이브러리 입니다.

이미지 로드 라이브러리에는 Glide, Coil, Picasso, Presco가 있으며, 이 중에서는 Glide가 가장 많이 사용됩니다.

이번 포스트에서는 Glide에 대해서 알아보는 시간을 갖도록 하겠습니다.

Glide 사용하기

Dependency

// Glide
implementation 'com.github.bumptech.glide:glide:4.11.0'
kapt 'com.github.bumptech.glide:compiler:4.11.0'

Gradle에서 Glide를 추가합니다.

기본 사용법

fun ImageView.setImage(url: String) {
    Glide.with(this)
        .load(url)
        .into(this)
}

기본 사용법은 매우 간단합니다.

with 에 Context 또는 View를 지정하고

load 에 불러올 이미지를 지정하고

into 에 불러온 이미지를 넣을 ImageView를 지정하면 끝 입니다.

Glide에서 제공하는 함수들

Glide는 단순히 이미지를 로드할 뿐만 아니라 여러가지 처리를 위한 함수들을 제공합니다.

fun ImageView.glide(url: String) {
    Glide.with(this)
        .load(url)
        .override(500,500)
        .thumbnail(0.1f)
        .placeholder(android.R.drawable.btn_plus)
        .error(android.R.drawable.stat_sys_warning)
        .into(this)
}
  • override : 불러오는 이미지가 너무 클 경우, 이미지 로딩 속도가 지나치게 느려지거나 심하면 OOM으로 앱이 죽어버리는 상황이 발생할 수 있습니다. 이때, override를 통해 이미지의 크기를 조절해서 로드할 수 있습니다.
  • thumbnail : override와 같은 상황에서, 화질이 낮은 이미지를 먼저 보여주고 원본 이미지를 보여줄 수 있습니다. (0.1f = 10%화질)
  • placeholder : 이미지가 로딩 되기 전 표시되는 이미지 지정합니다.
  • error : 이미지 로드에 실패했을 때 표시되는 이미지를 지정합니다.

이미지 캐싱

또, Glide는 이미지 캐싱까지 지원합니다.

만약 동일한 URL에서 반복적으로 이미지를 불러올 때, 계속해서 이미지를 받아오는 것은 굉장한 낭비입니다.

이미지 크기가 작은 상황에서는 퍼포먼스 상에서 큰 문제가 없겠지만 큰 이미지를 받아오는 상황이라면 매번 수 초의 시간과 상당한 양의 메모리를 투자해야 하며, 이는 사용자 경험을 떨어트립니다.

이런 문제를 해결하기 위한 방법이 이미지 캐싱입니다.

URL에서 가져온 이미지를 캐시에 저장해서 동일한 URL를 요청했을 때, 캐시에 저장한 이미지를 꺼내 재요청을 할 필요 없이 속도를 향상시키는 방식입니다.

Glide에서는 이런 이미지 캐싱을 직접 구현하지 않고 쉽게 사용할 수 있도록 도와줍니다.


이미지 출처 : https://medium.com/android-news/best-strategy-to-load-images-using-glide-image-loading-library-for-android-e2b6ba9f75b2

Glide가 요청을 받은 후 이미지를 가져오는 과정입니다.

메모리 → 디스크 순으로 캐시를 확인하고, 데이터가 있다면 해당 데이터를 리턴 합니다.

만약 메모리, 디스크에 데이터가 없다면 그때 네트워크를 통해 데이터를 가져오고 디스크, 메모리 캐시에 저장합니다.

Glide.with(this)
        .load(url)
        .into(this)

with load into 로 구성된 기본 사용법대로 사용하면, Glide에서 기본적으로 이미지 캐싱을 합니다.

하지만 이렇게 사용할 경우 특정 상황에서 문제가 생길 우려가 있습니다.

만약, URL은 동일하지만 URL의 이미지가 기존과 다르다면 어떻게 될까요?

Glide는 동일한 URL에서 요청하는 것을 감지하고 캐시에 저장해놓은 URL을 가져와 쓰게 됩니다.

결과적으로 변경된 이미지를 가지고 올 수 없게 됩니다.

Glide.with(this)
        .load(url)
        .diskCacheStrategy(DiskCacheStrategy.NONE)
        .skipMemoryCache(true)
        .into(this)

위와 같은 상황에서는 이런 식으로 Glide에서 캐시에 저장하지 않도록 설정합니다.

diskCacheStrategy 는 디스크 캐시에 대한 옵션을 지정합니다. 옵션은 다음과 같습니다.

  • DiskCacheStrategy.ALL : 모든 이미지에 대하여 캐싱
  • DiskCacheStrategy.AUTOMATIC : 전략적인 캐싱
  • DiskCacheStrategy.DATA : 원본 이미지만 캐싱
  • DiskCacheStrategy.NONE : 캐싱 안함
  • DiskCacheStrategy.RESOURCE : 해상도를 줄인 이미지만 캐싱

Listener

Glide에는 이미지 요청에 대한 리스너도 제공합니다.

val listener = object : RequestListener<Drawable> {
        override fun onLoadFailed(
            e: GlideException?, model: Any?, target: Target<Drawable>?, isFirstResource: Boolean): Boolean {
            TODO("Not yet implemented")
        }

        override fun onResourceReady(resource: Drawable?, model: Any?, target: Target<Drawable>?, dataSource: DataSource?, isFirstResource: Boolean): Boolean {
            TODO("Not yet implemented")
        }

    }
  • onLoadFailed : 로딩 실패 시
  • onResourceReady : 로딩 성공 시

RequestOptions

Glide를 사용하는 ImageView가 여러개고, 모두 동일한 Option을 공유한다면, RequestOptions 객체를 통해 옵션을 공유할 수 있습니다.

val request = RequestOptions()
        .override(500,500)
        .placeholder(android.R.drawable.btn_plus)
        .error(android.R.drawable.stat_sys_warning)
        .diskCacheStrategy(DiskCacheStrategy.ALL)

Glide.with(this)
        .load(url)
        .apply(request)
        .into(this)

예시 코드에 보이는 것 이외에도 여러가지 RequestOptions에서 지원하는 option들을 추가해서 사용할 수 있습니다.

profile
안드로이드 개.....발자?

0개의 댓글