관리 메뉴

HAMA 블로그

안드로이드의 HTTP Client 선택 - (번역) 본문

안드로이드

안드로이드의 HTTP Client 선택 - (번역)

[하마] 이승현 (wowlsh93@gmail.com) 2015. 7. 24. 17:05


네트워크를 사용하는 대부분의 안드로이드 앱은 HTTP 을 사용해서 데이터를 주고 받는다. 

안드로이드는 두가지 HTTP 클라이언트 클래스를 가지고있는데, HttpURLConnection  과 Apache HTTP Client 이다. 

둘다 HTTPS 를 지원하며, 스트리밍 업로드, 다운로드 와 타임아웃 설정 , IPv6 및 커넥션 풀링등을 지원한다.


Apache HTTP Client

DefaultHttpClient 와 그것의 형제인 AndroidHttpClient 는 웹 브라우저에 맞춰진  HTTP 클라이언트 확장이다. 다양하고 유연

한 API 들을 가지고있는데 안정되고 거의 버그가 없다. 그러나 그런 커다란 API 사이즈는 하위호환성을 깨지 않고 개선 시키기

가 어려우며 안드로이드 팀은 그것을 적극적으로 사용하지 않는다.




HttpURLConnection

HttpURLConnection 는 대부분의 어플리케이션에 적합한 일반적인 목적의 가벼운 HTTP 클라이언트이다. 이 클래스는 조금 

기초적인 기반을 가지고있지만, 안정적으로 향상시킬수있기 쉽게 되어있다. 프로요 버전 이전에 HttpURLConnection 은 약간의 

버그를 가지고있었다. 특히 readable InputStream 에서 close() 를 부르는것은 커넥션 풀을 맛가게 할수 있었다.


private void disableConnectionReuseIfNecessary() {

   
// HTTP connection reuse which was buggy pre-froyo
   
if (Integer.parseInt(Build.VERSION.SDK) < Build.VERSION_CODES.FROYO) {
       
System.setProperty("http.keepAlive", "false"); // HTTP 커넥션 재사용은 HTTP 의 KeepAlive 옵션의 역할
   
}
} KeepAlive 란? http://brad2014.tistory.com/341


진저브레드 버전에서는 transparent response compression  를 추가했다. HttpURLConnection 는 자동적으로 이 헤더를 요청

에 추가하고 돌아오는 응답을 핸들링할것이다.


Accept-Encoding: gzip


만약 응답 압축이 문제가 있을때  class documentation  를 보면 어떻게 비활성화 시킬수있는지 나와있다.

HTTP 의 Content-Length 헤더는 압축된 사이즈를 돌려주기 때문에 비 압축 데이터의 버퍼 크기를 그것으로 잡으면 에러가 생길

수 있다. 대신해서  InputStream.read() 이 -1 을 리턴할때까지 읽어야한다. 

우리는 또한 진저브레드 버전에서 여러가지 HTTPS 향상을 이루어냈는데 HttpsURLConnection  는 SNI(Server Name 

Indication) 을 가지고 접속 시도를 한다. 그것은 IP 주소를 공유하기위해 multiple HTTPS 호스트를 허용한다. 또한 세션 티켓들

과 압축을 활성화 할수있다. 커넥션 실패일때 자동적으로 재시도한다. 이것은 오래된것에 대한 호환성을 깨지 않고  최신의 서버

에 접속할때 HttpsURLConnection 를 효율적이게 만든다.


아이스크림 샌드위치에서 응답캐쉬를 추가했고,  HTTP 요청은 3가지방법중 하나로  이루어진다.


- 완전한 캐쉬 응답은 로컬 스토리지로부터 직접적으로 서비스된다. 

- 상황에 따라서 캐쉬된 응답은 최신의 것이라는것이 웹서버에 의해 검증된다. 클라이언트는 “Give me /foo.png if it changed 

   since yesterday”  같은 요청을 보내며 , 서버는 업데이트된 내용을 보내주거나 304 Not Modified 상태를 보내준다.."컨텐츠

   가 그대로니깐 다운로드될 필요없다라는~"

- 캐쉬되지 않은 응답은 웹으로부터 서비스되며 이 응답은 후에 응답캐쉬에 저장될것이다.


리플렉션을 사용하여 디바이스상에 HTTP 응답캐쉬를 활성화하는 샘플. 이 샘플은 이전 버전에는 영향없이 아이스크림 샌드위치

버전부터 응답캐쉬를 작동시킨다. 


private void enableHttpResponseCache() {

   
try {
       
long httpCacheSize = 10 * 1024 * 1024; // 10 MiB
       
File httpCacheDir = new File(getCacheDir(), "http");
       
Class.forName("android.net.http.HttpResponseCache").getMethod("install", File.class, long.class)
           
.invoke(null, httpCacheDir, httpCacheSize);
   
} catch (Exception httpResponseCacheNotAvailable) {
   
}
}

* HTTP 응답상의 케쉬헤더를 세팅하기위해 웹서버를 설정해야한다. 



그래서 뭐가 좋은건데? 


apache HTTP client 는  Eclair and Froyo 에서 아주 작은 버그를 가지고있고 저 버전을 사용할땐 베스트이다.

진저브레드에서는 HttpURLConnection  가 베스트이다. 그것의 단순함과 작은 사이즈는 안드로이드에 딱이다.

Transparent comppression 과 응답캐싱은 네트워크 부하를 줄이고 속도를 향상시키며 베터리에도 좋다. 

새로운 어플리케이션은 HttpURLConnection   로 하자. 

Comments