2008/12/01 17:54

안드로이드에서 아파치 xml-rpc 사용하기. eNg + iNe +eEr

올해 7월 경에 혼자서 안드로이드용 네이버 책 검색을 만들면서 검색된 책 내용을 블로그에 담아주는 부분을 만들었었다. 그리고 그 내용은 네이버 오픈API를 이용한 Google Android용 Book Search (2) - Blog It! 기능 추가라는 이름으로 포스팅한 적이 있다. MetaWeblog API를 이용하도록 했고, 조금 당연하게도 아파치에서 배포하는 xml-rpc 3.1을 사용했다.

그런데 생각보다 그걸 사용하는데 많은 사람들이 문제에 부딪히는 것 같다. 통계에서 보면 검색어에 꾸준히 "안드로이드 xml-rpc 사용"과 같은 것들이 남아있고, 이번엔 어떤 분이 비밀글로 "어떻게 해결하셧는지 궁금해서 도움을 좀 얻고자.이렇게 댓글 남겨요.." 라는 댓글을 달아주셨다.

별거 없고, 다만 구글링만 했을 뿐인데, 괜히 내가 무슨 비기의 소유자가 된 기분이랄까?

일단, 안드로이드에 어플리케이션을 개발한다면 다음과 같은 사항을 유의해야 된다.

1. Dalvik VM은 Sun의 VM과 다르다: 안드로이드의 자바는 썬의 자바와 다르다. 문법적인 요소는 거의 같으나 지원하는 라이브러리와 몇몇 사소한 문법적인 요소가 다르다. 대표적으로 7월 당시의 안드로이드 SDK에서는 자바 5.0 이상에서 지원하는 Annotation과 Generic을 지원하지 않았다.

2. 대부분의 자바 라이브러리들은 최신 자바 버전에 맞춰져 있다: 자바 관련 오픈 소스 커뮤니티는 정말 활발하게 움직이기에 언제나 코드는 최신 자바 VM에 맞춰져 있고, 애석하게도 이전 버전 (1.3, 1.4) 또는 다른 버전에서 정상 동작하지 않을 수도 있다.

1번과 2번을 합쳐서 생각해보면, 각종 자바 라이브러리 중에 안드로이드에서 사용할 수 없는 것들이 있는 것이 너무나도 당연해 보인다. 자바가 byte-code 단위에서의 platform-independency를 보장해준다고는 하지만, Dalvik처럼 조금 특화된 VM이 나와버리면 저 보장이 보장이 아닌 것이 될 수 있다는 것이다.

아파치에서 배포하는 xml-rpc 코드를 뜯어보면 Dalvik에서는 지원하지 않는 것들이 꽤나 들어가 있는 것을 확인할 수 있다. 대표적인 것들이 Java SE 5에서 처음 소개된 Annotation(메타데이타)와 Generic들이다. 아마 Dalvik 컴파일러는 이 두 가지를 전혀 지원하지 않을 것이기에 자신이 짠 코드를 아파치 xml-rpc와 함께 컴파일하면 중간에 에러가 날 것이다. 에러 코드는... 기억 안난다.

그렇다면 이쯤에서 선택은 세 가지 정도가 있다. 첫째, xml-rpc 코드를 뜯어고친다. 하지만 이 방법은 정말 추천할 수 없는 것이, xml-rpc가 버전 업 될때마다 코드를 뜯어고칠 수는 없는 노릇이고, 만약 그렇게 할 바에야 그냥 직접 xml-rpc 코드를 하나 깔끔하게 짜놓는 것이 낫지 않을까. 둘째, 안드로이드 Dalvik 컴파일러가 Annotation를 비롯한 모든 Java SE 5.0 이후의 기능을 지원하길 마냥 기다린다. 덤으로 매일 자기 전에 지구 상에 있는 모든 신들한테 "제발 구글이 기능을 넣게 만들어주세요"라고 기도하는 것도 추가하는 것도 나쁘지 않을 것 같다. 하지만 이것도 그닥 개발자적인 마인드는 아니다.

셋째, Retrotranslator(링크)를 활용한다. Retrotranslator는 Java 5.0 환경에 맞춰진 byte-code를 수정하여 java se 1.3과 1.4 등에서 동작하도록 만든다. 대표적으로 다음과 같은 Java 5.0 "전용" 기능들에 대해 지원한다.

  • Generics
  • Annotations
  • Reflection on generics and annotations
  • Typesafe enums
  • Autoboxing/unboxing
  • Enhanced for loop
  • Varargs
  • Covariant return types
  • Formatted output
  • Static import
  • Concurrency utilities
  • Collections framework enhancements

난 뭐, 원래 자바 개발자도 아니고 자바라고 해봤자 혼자 책 한권 읽고 "아, 이것이 자바고, 이것이 OOP인 것인가?(어리둥절)"한 것이 전부이기에 저 위에 있는 것들은 거의 모르는 것이 많다만, 어쨌든 나에게 중요한 것은  "Generic"과 "Annotation"에 대한 지원 여부였다. 그리고 저 retrotranslator를 이용하여 아파치 xml-rpc 바이트 코드들의 generic과 annotation들을 쏵~ 날려버리고 컴파일하니 전혀 문제 없이 활용 가능했다.

Retrotranslator의 사용법은 알아서 위의 링크를 타고 들어가서 보면 된다. 아주 간단히 사용할 수 있다. 자신이 사용하는 개발 환경에서 컴파일 전 pre-processing 단계에서 아파치 xml-rpc의 클래스 파일들에 대해서 retrotranslator를 적용하도록만 설정해주면 된다. 참고로 나는 그냥 재미로 했던 것이기에 손으로 아파치 xml-rpc 클래스를 한번만 translate하고 사용했다.

혹시 이래도 안되면?

컴파일의 문제면 컴파일시 나오는 메시지를 찬찬히 검토하고, 런타임의 문제면 안드로이드 에뮬레이터의 메시지와 상태를 잘 확인하자.


덧. 임베디드 소프트웨어 개발을 할 때는 언제나 타겟 환경과 호스트 환경의 차이에 대해서 고민하게 된다. 그리고 보통 부딪히는 문제들은 타겟 환경에 대한 이해가 부족해서 생기는 것들이다. 임베디드 소프트웨어만이 아니라 서버 소프트웨어를 만들 때도 동일하고, 클라이언트 소프트웨어를 만들때도 마찬가지로, 언제나 자신이 개발하는 소프트웨어가 동작할 환경에 대한 깊은 이해는 필수라고 생각한다. 물론 일정에 쫓기고 개념없는 클라이언트한테 쪼이고 몰상식한 상사들한테 갈굼 당하는 환경에서는 힘들겠지만... (갑자기 현업에서 고생하시는 분들 생각에 울컥..)


덧2. 코드 공개했습니다. 6시간짜리 날림 코딩의 진수지만 처음 안드로이드를 접하시는 분들은 참고하실만 할 것 같습니다. 코드는 이곳에...


트랙백

이 글과 관련된 글 쓰기 (트랙백 보내기)
TrackbackURL : http://engineered.egloos.com/tb/2156970 [도움말]

덧글

덧글 입력 영역