LegoLibrary 앱 리팩토링 [서문]

ic_launcher

  LegoLibrary앱은 레고를 좋아하고 개발 공부를 하고 싶은 개인적인 니즈로 인해 만들게 된 안드로이드 앱이다. 초기 개발 당시 상황을 보면 아래와 같았다.

  1. Volley, Volleyer를 이용한 rest 통신. (하지만 서버 api를 php로 개발 했을때 rest에 대한 개념이 부족하여 restful하게 만들지는 못했었다. )
  2. 기존에 만들어 둔 소스나 모듈들을 최대한 재 사용. (ClearableEditText, SlidingLayer 등)
  3. Activity나 Fragment에서 데이터의 처리, api 통신 콜, 콜백의 구현을 모두 처리하게 되면서 소스의 양이 방대해지고 복잡하게 얽혀있었다. 특히 비동기 처리후 콜백의 구현이 난잡하게 얽혀있거나 익명 클래스로 구현되어 있어 찾기 복잡했으며 수정도 어려웠다.

이러한 단점들을 없애고 공부도 하고 싶은 생각에 몇가지 새로운 기술들을 시간을 들여 알아보았었다.

  1. RxJava, RxAndroid : 요즘 핫한 기술 중 하나이다. 반응형 확장(Reactive Extensions)으로서 옵저버 패턴을 이용하여 비동기들의 처리와 이벤트 기반 프로그래밍을 할 수 있게 해 준다. 진입 장벽이 꽤 높은 편이다.
  2. MVP pattern : 기존의 MVC패턴에서 MVP(Model-View-Presenter) 패턴을 적용 해 보았다. 하지만 시간이 없어서 점진적으로 진행 하여 Activity부터 하나씩 차근차근 진행 해 나갈 생각이다.
  3. Retrofit 2, okHttp : Rest통신을 위한 Retrofit과 http통신 클라이언트 라이브러리로서 기존의 Volley와 Volleyer를 대체하여 RX에 걸맞는 비동기(혹은 동기) 처리를 하게 할 생각이다.
  4. Lambda : 람다식은 Java8 이전버전에서는 지원 하지 않는다. 그래서 현재 알려진 Android Studio에서는 람다식을 사용 할 수가 없다. 하지만 RetroLambda 플러그인을 사용하면 람다식을 사용 할 수 있다. 일단 소스의 간소화를 위해서 람다식에 익숙해지려 하는게 목적이다.
  5. butterknife : 버터 나이프는 view의 바인드 처리나 static한 리소스 값(dimen, String 등)을 어노테이션을 이용하여 바인드 처리 하게 해 준다. 그 간단함은 꽤 유용하게 쓸 수 있다.
  6. Realm : Sqlite를 대체해서 로컬 no-sql db로 사용 한다. sql 쿼리를 작성하기 위해서 골머리를 쌓고 테이블의 구성에 대해서 고민할 시간을 더 줄이고 싶어서 사용하게 되었다.

최종적인 목표는 다음과 같다.

  1. RxAndroid + (RetroFit2 + okHttp3) + RetroLambda 를 이용한 비동기 처리. 
  2. MVP 패턴을 활용한 data(처리, 구현 등) 와 view에 대한 처리등의 분리. 
  3. 그 외 불편한 요소나 미구현된 부분 완성. 

아직 배우고 있는 중이고 찾아가면서 하는 중 이기 때문에 내가 하는 방법이 진정 맞는 길인지는 알 수가 없다. 다만 이미 오픈되어진 소스들을 참고 하여 비슷하게라도 따라가는게 목적 중 하나라 할 수 있겠다.

위 라이브러리 모듈들의 세팅법들은 다음과 같다.

  • Realm 세팅 : 링크
  • ButterKnife 세팅 : 링크
  • RetroLambda 세팅 및 간단한 사용 법 : 링크
  • RxAndroid 세팅 : 링크  (2016/06/07)
  • Retrofit, okHttp 세팅 : 작성 중

 

다음 첫번째 리팩토링 문서에서는 다음을 다루려 한다.

  • MainActivity에서 서버로부터 달러 환율을 가져 온다.
  • 비동기로 가져오고 난 뒤에 환율의 값을 model에서 소유 한다.
  • 클래스 및 인터페이스
    • RetrofitAdapter :  singletone패턴으로 구현된 Retrofit의 인스턴스를 다루는 adapter이다. getInstance()메소드가 존재 하며 이 메소드에서 인스턴스를 생성하게 되는데 okHttp클라이언트 빌더를 통해서 기본적인 설정을 하게 한다. 또한, Rx adapter나 GsonCoverterFactory등의 설정을 내부에서 한다. .
    • NJobInterface : Retrofit의 실제 작업을 수행하게 될 메소드들의 추상적인 형태들이다. Retrofit의 어노테이션을 통해 api에 대한 resource들을 할당 하고 쿼리하기 위한 키와 값들을 설정하기도 한다.
      • Call 인터페이스 : Retrofit의 기본적인 callback을 받기위한 구현체 이다.
      • Observable<T> : Retrofit을 통해서 Rx에 사용하기 위한 Observable인스턴스로 받을 수 있다. 거의 대부분의 callback을 이 형태로 받으려 한다.
  • MVP pattern
    • MainActivity : View 인터페이스의 구현체 -> Presenter 클래스에서 Model로부터 데이터를 받아서 실제로 View에 데이터를 세팅하게 한다.
    • MainPresenterImpl : Model에서 세팅되어진 데이터를 가져오거나 세팅한다. 그리고 Presenter에 1:1로 매칭되는 View interface를 가지고 있으며 이 를 구현한 MainActivity에 view의 갱신을 하게 한다.
    • MainActivityModel : 실제로 data를 (비동기로) 가져오거나 세팅 한다. 대부분의 서버측에 대한 api 콜이 이 Model내부에서 Rx의 형태로 구현 되어진다.

ref_001

 

시간이 나는대로 차츰차츰 해야겠다.. 쉽게 생각했지만, 생각보다 진입장벽도 높고 어렵다. (그런데 진짜 개발 하는게 재밌어짐. 새로운 기술 이라서 그런걸까?)

 

참고하면 좋은 글들

 

You may also like

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.