Tempo Di Valse

[Android] Glide with PDF -1(기초공사)- 본문

개발/Android

[Android] Glide with PDF -1(기초공사)-

TempoDiValse 2022. 1. 26. 21:47

Glide 는 Android 에서는 거의 필수적으로 사용하는 이미지 로드 라이브러리이다. 뭐 이보다 Lightweight 하다는 Picasso 도 유명한 라이브러리 이지만, Glide 가 그나마 접근하기 쉬운 라이브러리이며 구글에서도 Glide 를 좀 더밀어주는 느낌도 있어서 더 많이 쓰고 있다.

 

Glide 는 이미지 이외에도 Gif, Drawable 그리고 Video 썸네일까지 다양하게 불러올 수 있다. 다루는 객체들이 Bitmap 이다보니 Bitmap 을 추출 할 수 있는 무언가가 있으면 지원을 할 수 있는 것 같아보였다. 그래서 나는 PDF 를 ViewPager 에 뿌려주는 일이 필요해서 찾아보았는데, PDF 는 자체 Glide 내에서 렌더 시키는 모듈은 없었고 따로 Pdfium 이라는 라이브러리를 사용하여 Bitmap을 추출한 후 Glide 를 돌려보았는데.... 여기서 발생한 큰 문제, 바로 Caching 이 되지 않는 문제가 생긴 것이다.

 

Glide는 Caching 을 URI, File, Path 등의 식별 가능한 정보로 불러온 데이터는 지원을 암호화된 Key 형태로 지원해주지만, Bitmap 이나 InputStream 계열로 불러와진 객체에 대해서는 "이것이 어떤 것이네?" 라는 특정을 할 수 없어서 전혀 Caching 이 되지 않는 것이었다. 

 

StackOverflow 에서는 signature() 라는 메소드에 ObjectKey() 를 이용하여 Key 값을 지정해주면 되지 않느냐 써있는 것 같았는데 뭐... 안되니까 만든다.

 

필요했던 것을 요약해 보면,

1. PDF 를 Glide 를 이용해 렌더 한다.

2. 렌더 할 때에는 Caching 이 되어야 한다.

 

그래서 두 가지의 사항을 충족하는 라이브러리를 찾기 위해 열심히 구글링을 했지만 내가 찾기로는 Glide 에 PDF 를 연결하는 그런 Extend 한 라이브러리는 없더라.. 결국 Glide 에서 제공 해주고 있는 Document 를 찬찬히 보아가며 따로 모듈을 만들어 보았다. 


1. Glide 를 모듈화 하기위해 커스텀을 해보자

Glide 를 보통 사용하게되면 Glide.with(context).~ 이런 방식으로 사용하게 될 것이다. 물론 이 방법도 맞긴 하지만 내 앱에 맞게 커스텀 할 일이 있다 싶으면 GlideApp.with(context) 이런 방식으로 확장가능한 객체를 사용하도록 해야 한다.

 

일단 Glide 를 앱에 입혀보도록 하자.

 

https://github.com/bumptech/glide

 

Glide Github 에 들어가보면, 작성글 날짜 기준으로 4.11.0 버전이 가장 Latest 한 버전이라고 나와있다. Android 유저는 Gradle 을 사용하기 때문에 build.gradle 에 Glide 를 탑재해 주자. 그런 다음에 Glide 를 사용할 곳에서 추가하려하면, 

GlideApp 이란게 안보이네. GlideApp 이 보이려면 Glide의 Module 관련된 Annotation 이 설정된 클래스를 따로 만들어 주어야 한다. 

 

먼저, kapt 라는 것을 gradle 에 설정 해야된다. kapt 는 Kotlin 에서 사용하는 Annotation Processor 인데, 이것을 설정해줘야 프로젝트가 Annotation 을 자동으로 Generate 시켜 객체를 생성해 줄 수 있다. kapt 를 사용하기위해서는 build.gradle 에 다음처럼 설정한다

...
apply plugin: 'kotlin-kapt'
...

android { ... }

dependencies {
    implementation 'com.github.bumptech.glide:glide:4.11.0'

    // annotationProcessor 를 kapt 로 바꾼다
    kapt 'com.github.bumptech.glide:compiler:4.11.0' 
}
 

gradle 설정이 되었다면, GlideApp 을 생성할 정보를 입력하기 위해 Class 를 만든다.

여기서 Class 는 정의만 해놓고 어디서도 사용하지 않기 때문에 이름은 중요하지 않다. 중요한 것은 Class 위에 GlideModule 이라는 Annotation 을 붙여주어야 한다는 것이다. 해당 Annotation 이 있어야 컴파일이 돌 때 GlideApp 이라는 Class 를 시스템에서 생성을 시켜준다.

 

그리고 Class 는 AppGlideModule 을 상속 받아야 한다. 해당 클래스에는 대략 3가지의 메소드를 override 할 수 있는데 isManifestParsingEnabled 는 일단 뭔지 모르지만 false 를 넣으라고 하길래 false 를 놓고 패스하고,

 

registerComponents 는 내가 Glide 에서 사용할 모듈을 개발했는데 그 모듈을 사용하려 등록하고자 할 때 사용되는 메소드로, registry 라는 변수가 해당 등록을 담당하고 있다.

 

applyOptions 는 Glide 모듈의 Default 를 지정해주는 메소드인데 공통적으로 placeholder 를 지정하고 싶거나, 메모리 캐싱 정책을 정해놓고 싶거나 할 때 사용한다.

 

두 메소드는 super 가 딸려있지만, super 에는 아무런 로직도 작성되지 않았기 때문에 super 를 지우고 사용해도 된다.

 

일단, 여기까지만 정의해놓고 먼저 컴파일을 돌려보게 되면 java(generate) 라는 폴더에 다음의 package 와 Class 들이 생성되어있는 것을 볼 수 있으며, 사용하고자 하는 곳에서도 Glide 를 치면 GlideApp 를 볼 수 있을 것이다.

자세한 사항은 아래 공식 Glide 문서에서도 확인할 수 있다. 그럼 다음 단계로 넘어가보자.

http://bumptech.github.io/glide/doc/generatedapi.html#glideextension

 

2. Pdfium 을 설치해보자

Pdfium 은 PDF 를 로드하는 대표적인 라이브러리 이다. Android 에서는 PDF 를 렌더해주는 PdfRenderer 라는 API가 있는데 요즘은 API 버전이 높아서 괜찮지만 예전에는 사용할 수 있는 API 가 21 부터 가능했기 때문에 이 API 는 사용할 수 가 없었고 기능도 딱히 Bitmap 을 렌더 하는 것 외에는 할 수 있는 것이 없어서 사용을 하지 않았다. 

 

대신에 잘 알려져 있던 라이브러리인 Pdfium 을 이용하여 Bitmap 으로 렌더를 할 수 있었다. Pdfium 은 Google Open Source 에 올려져있는 라이브러리로 게다가 C로 된 네이티브 소스이기 때문에 Android 에서 처리하는 것 보다는 빠르다는 장점도 있어서 사용했던 것 같다. 하지만 네이티브 소스인 만큼 Android 로 호환이 되어져있는 라이브러리가 없었기 때문에 Android 에 맞는 라이브러리를 찾아야 했는데 마침 어떤 외계인이 Android 에서 사용할 수 있도록 만들어 놓은 라이브러리가 있어 해당 라이브러리를 받아 사용할 수 있었다

 

https://github.com/barteksc/PdfiumAndroid

 

이 라이브러리도 build.gradle 에 추가해 보도록 하자.

 

3. View 를 구성해 보자

View 는 ViewPager 로 뿌려줄 것이기 때문에 ViewPager 및 Fragment 를 잘 조합하여 만들어 보도록 하자.

나는 새로 나온 ViewPager2 를 사용해 볼 것이다.

 


다음 포스팅에서는 Glide 에 등록 하는 ModelLoader 와 DataFetcher의 구현에 대해 알아보도록 하겠다.

 

 

 

 

반응형
Comments