Google Android Volley HTTP Library

2017. 7. 19. 14:15Programing/Android Open Source

Google Volley Library


Google I/O 2013에서 처음 발표 된 Volley Library는 굉장히 강한 자부심을 가지고 Google에서 소개한 Http 라이브러리입니다. 효율적인 병행 처처, 재시도, 백오프 정책, 캐시, 이미지 로더, 우선순위 설정 및 요청 취소등의 다양한 기능등을 제공하면서 강력한 HTTP Library라는 점을 강조하였습니다. 쉽게 이야기 하면 Side Effect도 없고, Code Line도 Simple하게 구현이 가능하게 제공을 한다는 것입니다.


[Volley란 무엇인가?]

Volley는 테니스나 발리볼의 발리를 연상하게 하고, 클라이언트가 넷 넘어로 서버에 요청을 쏘면 그것이 돌아온다는 은유가 되기도 합니다.( a client sends a request a server over the net. It comes back.) 그러나 제가 이름을 지을 때는 '일제 사격'( A burst or emission of many things or a large amount at once.) 의 광경을 생각했습니다.


Volley의 기능을 정리해 보면 아래와 같습니다.

- 요청작업큐 + Thread pool을 이용한 동시 요청 지원.

- 요청별 우선 순위 

  목록조회와 이미지 다운로드를 할때 목록조회가 우선순위가 높게 설정. 다음 페이지의 목록조회를 요청하면 이전페이지의 이미지로딩이 끝나지 않아도 기다리지 않고 수행.

- Transparent cache

  요청하는 쪽에서 Cache 적용여부를 의식하지 않아도 됨. 이미지 로딩툴, NetworkImageVIew라는 View 제공.

- 요청 취소 

  특정 요청, 해당 Context의 요청 모두 취소할 수 있고, 취소할 규칙도 지정 가능

- 진저브레드 이전의 HttpURLConnection의 버그 문제 해결

  2013년 5월 The platform에 기고한 Android의 HTTP 클라이언트 라이브러리 기사에서 다룬 여러 오픈소스가 그랬던 것처럼 진저브레드 이상에서만 java.net.HttpURLConnection을 쓰는 로직이 들어가 있습니다.

- retry, backoff policy 지원, 확장 기능

- SPDY 지원

  발표 당시에는 Volley의 tranport stack으로 OkHttp( http://square.github.io/okhttp/ ) 를 넣는 작업이 누군가가 진행하고 있다고 했는데, 기사를 작성한 이후에 따끈따끈하게 공개 되었습니다.

- JSON, XML, Image, protobuffer 등 다양한 Response형식을 처리하도록 확장 가능


자신감을 나타내는 또 다른 요소는 바로 Benchmark 결과입니다. 당시 현존하는 다양한 Library들과 비교했을 당시 100% 빠른 결과를 냈고, 심지어 10배까지 빠른 경우가 있었기 때문입니다. 추가로, Google이 개발 시 경험했던 문제점들에 대한 해결책이 녹아 들어있기 때문에, 개발자들이 더 이상 고민을 할 필요없이 간편하게 사용만 하면 되기 때문입니다. 어찌보면, 개발자를 꿈꾸고 공부하는 사람들에게는 독이든 성배일지도 모르겠습니다. 


라이브러리 소스도 공개하였습니다.

아래와 같이 libary를 생성하셔서 사용하시면 됩니다.

    git clone https://android.googlesource.com/platform/frameworks/volley

    cd volley

    ant jar

또는, 아래 경로에서 다운받아 사용하셔도 됩니다.

    http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22com.mcxiaoke.volley%22

혹은 아래 경로에서 소스를 다운받아 직접 빌드를 하셔도 됩니다.

    https://github.com/mcxiaoke/android-volley


장점도 많고 사용성이 뛰어나다고 해서 단점이 없는 것은 아닙니다.

- 릴리스 프로세스와 패키지 관리 부재

- 다양한 구현체 부재

- 페이로드가 큰 요청에 대한 교려 부재

- Request Class 상속에 관련 문제

- Cache에 대한 구현체 부재


때문에, 많은 사람들이 단점을 보완하여 새로운 라이브러리를 제시하고 있습니다.

1. com.android.volley.toolbox.ImageLoader.ImageCache 구현

  - Ficusk의 LruBitmapCache : android.support.v4.util.LruCache를 상속해서 구현. Google I/O 2013 발표에서 공유.

    https://gist.github.com/ficusk/5614325

  - howrobotswork의 DiskBitmapCache : Volley의 DiskBasedCache를 상속해서 구현

    http://howrobotswork.wordpress.com/2013/06/02/downloading-a-bitmap-asynchronously-with-volley-example/

  - 전형일님의 WeakImageCache : java.lang.WeakReference를 활용.

    https://gist.github.com/givenjazz/5626084

    

Google IO 2013에서 Volley 세션의 발표자인 Ficus Kirkpatrick는 Google쪽에서는 soft reference나 weak reference를 쓰지 않는다고 언급을 하기는 합니다.( And so we don't use soft references or weak references. They don't work well. We use hard references and set a strong budget. we are conservative in setting that budget by scaling down with the screen and really the number of pixels ) 그래도 단순한 구현이라는 점에서 WeakImageCache 참고할만합니다.


2. com.android.volley.Request 상속

  - Ficusk의 GsonRequest : Google Gson 라이브러리로 json을 파싱하는 구현. Google I/O 2013 발표에서 공유.

    https://gist.github.com/ficusk/5474673

  - njzk2의 DelegatingRequest : Request에 addHeader()메소드로 헤더 설정 가능. HTTP 인증 때문에 만든 클래스.

    http://njzk2.wordpress.com/2013/06/17/an-extension-to-volley/


3. com.android.volley.toolbox.HttpStack 구현

  - Jake Wharton의 OkHttpStack : HttpURLConnection이나 Apache HttpClient대신 OkHttp를 사용할 수 있는 구현

    https://gist.github.com/JakeWharton/5616899

  

4. com.android.volley.toolbox.NetworkImageView 상속

  - benvd의 FadeInNetworkImageView : 이미지 보일 때 페이드인 애니메이션을 추가

    https://gist.github.com/benvd/5683818

  

5. com.android.volley.toolbox.ImageLoader 상속

  - njzkw의 ExtendedImageLoader : 기존 ImageLoader가 내부적으로 ImageRequest를 사용하는데, 이 클래스는 Request 구현체도 사용 가능.

    http://njzk2.wordpress.com/2013/06/17/an-extension-to-volley/

    

6. Naver Volley Extensions

   개인적인 생각으로 가장 단점을 보완하여 완전한 라이브러리를 만들려는 노력이 돋보이는 라이브러리라고 생각이 된다. 하지만 아쉬운 점은 더 이상 관리가 안되는 것으로 보인다.

   http://d2.naver.com/helloworld/1258547

   https://github.com/naver/volley-extensions

   

[Application 예제 및 설명]

Google Volley 기본 : http://victor8481.tistory.com/

http://www.kpbird.com/2013/05/volley-easy-fast-networking-for-android.html

http://kvandroidapp.blogspot.kr/2013/05/example-using-volley-google-framework.html

http://ogrelab.ikratko.com/android-volley-examples-samples-and-demos/\

https://github.com/ogrebgr/android_volley_examples\

http://blogs.captechconsulting.com/blog/raymond-robinson/google-io-2013-volley-image-cache-tutorial

구글 HTTP 마스터이자 현직 OkHTTP 개발자인 Jesse Wilson가 만든 예제 : https://github.com/swankjesse/android-http-examples/tree/master/volley-app

http://java.dzone.com/articles/android-%E2%80%93-volley-library

https://github.com/adamrocker/volley

https://github.com/carlemil/VolleyDemo/tree/Sebastian_blog_question

http://www.technotalkative.com/android-volley-library-example/



참고 사이트

https://www.itsalif.info/content/android-volley-tutorial-http-get-post-put

https://gist.github.com/benelog/5981448

http://d2.naver.com/helloworld/1258547