개발하며 지껄이기 #2 - Android 생각

- 웬만하면 접속을 UrlConnection / HttpUrlConnection(SDK 16)을 이용해서 처리하려고 했는데, 이때 RESTful API를 사용한다면 몇가지 클래스의 자의적인(?) 처리 때문에 문제가 생긴다. 이를테면 서버에서 401 (Unauthorized)를 내보내는 경우 java.io.HttpUrlConnection은 IOException: “Received authentication challenge is null” 을 내보내며, HttpUrlConnection.getResponseCode() 를 호출할 때 조차 예외가 발생하기 때문에 이를 이용해서 처리하는 것이 불가능하다. 참고
- Jsoup(1.7.1)은 Http 상태 코드와 관련해 HttpStatusException 이라는 좀더 직관적인 타입을 제시하지만, 전송할 데이터를 raw 형태로 지정할 수 없다는 문제가 있다. 예컨대 express js 서버는 json 형태의 post 데이터를 받을 수 있는 반면, Jsoup에서는 그런 식으로 데이터를 받는 것이 불가능하다. Jsoup(url).method(Method.POST).data(jsonString).execute().body() 코드를 실행하면 execute() 실행 시점에서 data는 반드시 key/value pair여야만 한다는 예외가 발생한다. 참고
- Apache Commons의 HttpClient는, Android SDK에 이미 내장되어 있다. 하지만 오래된 버전이고, 버그가 존재하며, SDK 버전마다 이 버그도 다른데다가, 현재는 호환성을 위해서 사실상 방치된 상태이다. 참고 application/libs에 HttpClient의 최신 바이너리를 넣어도 대체되지 않는다. 이에 대한 대안으로 리패키징된 httpclient가 존재한다.
- REST client에 특화된 자바 라이브러리인 Resty도 존재한다. JSON 라이브러리까지 내장되어 매우 편할 듯 한데, 안타깝게도 Anroid 2.3 미만에서 동작하지 않는다. 참고
- 결국 선택한 것은 Spring-Android의 RestTemplate이다. 안드로이드 특화 제품인 만큼 호환성도 폭넓고, 실행되는 안드로이드 버전에 따라 HttpClient과 HttpUrlConnection 중에 자동으로 최적의 버전을 선택해서 실행되는 등 최적화가 되어 있다. Gson이나 Jackson, Resty 처럼 JSON을 파싱하는 기능 역시 내장되어 있다.
- 여담이지만, RestTemplate 에서 발생하는 예외는 크게 HttpStatusCodeExcetion과 ResourceAccessException로 나눌 수 있다. 내가 기존에 HttpClient를 엮어서 만든 프레임웍의 예외가 HttpStatusException과 ConnectionException이었던 것과 완전히 일치. 덕분에 쉽게 포팅했다.
- HttpStatus 상수는 HttpClient를 사용하는 경우 ch.boye.httpclientandroidlib.HttpStatus를, Spring-Android를 사용하는 경우 org.springframework.http.HttpStatus 를 사용할 수 있다.

Leave Comments