FamilyBox Admin Project Memoir

요즘 iPad 앱을 개발하느라 블로그뿐만 아니라 Github 자체를 많이 하지 못하였다..ㅠㅠ

오늘 정리할 내용은 지난달에 주말포함 약 10일동안 패밀리박스 관리자앱을 만든 이야기를 하려고 한다.
(물론 내가 공부를 하고싶어서 자의로 주말에 코딩을 한 것이다.)

물론 신규개발이 아닌 기존의 앱을 코드 리팩토링 + 몇 개의 기능이 추가되었다.

먼저 나는 프로젝트를 하기 전에 프로젝트를 통해 무언가를 남기는 것을 좋아한다.

이번에는 그래서 아래의 것들을 빡세게 공부해서 코드를 리팩토링한 이야기를 하려고 한다.

왜 위의 라이브러리를 공부하려고 하는가?

  1. 기존의 패밀리박스 고도화를 통해 LiveData를 사용하여 값의 변화에 따라 View가 변할 수 있도록 옵저버블한 구조를 이해하고,
    RxJava와 LifeCycle을 사용한다면 비슷한(?) 구조를 만들 수 있을거라 생각했다.
  2. 사실 Dagger2를 너무 사용해보고 싶었다. 진짜 꼭 한 번 사용해보고싶은 라이브러리였다.
  3. 코틀린을 공부할 때 커니의 코틀린 책으로 공부하였는데, 이를 바탕으로 실무에서 사용해보고 싶었다.


개발 배경

당연한 이야기지만 패밀리박스의 관리자앱은 패밀리박스 팀 내부적으로 사용하는 앱이었고,
나에게 인수인계를 한 이전 운영자, 개발자분이 예전에 공지사항이나 서버차단등의 패밀리박스 앱을 컨트롤하기 위해 일주일동안 기존 패밀리박스 소스에 API 몇 개를 뚫어 급하게 만든 앱이었다.
(이 앱이 있기 전까지는 출근해서 등록해야 했다..ㅎㄷㄷ)

물론 급하게 만든 앱이기 때문에 2.0버전의 패밀리박스 소스에서 긁어온 기능들이 많아 코드 리팩토링 및 보안을 강화해야 할 필요가 있었다.


분석 및 설계

분석
  1. 기존에 사용하던 API를 정리하였다.
  2. 앱의 전반적인 구조와 보완해야 할 내용을 정리하였다.

설계
  1. 나는 앱을 개발하기 전 Gradle을 정리한다. Dependency, Flavor 설정 등을 가장 처음에 정리하였다.
    (사실 사용하고 싶은 라이브러리가 명확하게 있었기 때문에 금방 했다.)
  2. 어떤 앱을 개발하든 Code Convention 및 Git Branch 설계 정리는 기본이다.
    (사실 이번엔 Git은 대충 썼음ㅋ)
  3. 그외에 아키텍처 구조나 개발 일정등은 머릿속에서..


개발

힝ㅠ 개발 전 이슈가 있었다ㅠ

Kotlin Issue

당시 나는 패밀리박스를 롤오프하는 시점이어서 인수인계를 하며 앱을 개발하고 있었는데, Kotlin 관련 이슈가 있었다.
인계받으시는 개발자분은 멤버십에서 프로젝트를 진행하는 분이었는데, KT에서 사용하는 난독화 라이브러리와 Kotlin 사이에 컴파일 과정에서 이슈가 있었다고 한다.
사실 듣자마자 쫄아서 Kotlin으로 개발하기로 한 과정을 뒤엎고 Java로 개발하게 되었다.
(롤오프와 개발기간이 얼마 없었기에;;)
추가 네이버에서 비슷한 이슈가 있었다. https://d2.naver.com/helloworld/6685007

Dagger2 Issue

아직도 이 이슈는 끔찍했다.
앞서 말했듯이 10일동안 RxJava와 Dagger2를 급하게 공부하느라 깊게 보지 못한 나의 실수였다.

관리자앱에서는 Network Module을 Dagger2를 이용해 분리하려고 했었다.
토큰/세션등의 기능이 있었기에 Header를 캐치하기 위하여 Inpector를 사용하였고, 이 Inspector를 Retrofit에 Add하는 과정에서 문제가 발생한 것이었다!

@Provides 어노테이션을 하나 빼먹어서 Activity의 Factory에 의존성을 주입할 때 Module에서 자꾸 파라미터에 Dagger2 어노테이션이 없는걸 받을 수 없다고 한다.
이런 에러를 처음 접한 나는 헤멜 수 밖에 없었고 엄한데만 뒤지다가 12시간을 날려버렸던 이야기였다.
(말이 12시간이지 하루를 통째로 다 날렸다.)

확실히 개념을 잡고 코딩을 해야한다.

구조

그 외의 내용은 간단하다.

  1. 아키텍쳐 구조는 MVVM 패턴 사용
  2. 네트워크 모듈은 OkHttp와 Retrofit을 사용하고, Dagger2를 통해 의존성 분리
  3. Preference, Local DB는 사용하지 않았다. 단말기에 무언가를 저장하거나 접근하는 순간 KT 보안에 신경써야 할 내용이 굉장히 많아진다.
  4. RxJava를 통해 비동기작업을 쉽고 빠르게 + LifeCycle을 통해 생명주기 관리는 덤으로
  5. 암복호화나 난독화는 보안을 위해 선택이 아닌 필수!
  6. 기타 등등..


테스트

물론 테스트배드 서버에서 테스트를 진행하였고, 기존 앱과 동일하게 작동하였다!
보안 이슈도 처리했고, 산뜻한 마음으로 나는 KT와 작별했다.


사실 빡세게 공부하면서 안하고 기존 소스에 보안만 강화해도 되는 프로젝트긴 했었는데, 이번 프로젝트에서 나를 위해 공부했던 것들이 내가 더 성장하는데 도움이 되었다고 생각한다.
이제 더 깊게 공부하고 적용하는 일이 남아있다!

그리고 인계받으시는 개발자분께 엉망진창인 코드 넘겨드려서 죄송합니다.
아직 2년도 안된 개발자가 이것저것 공부하면서 짠다고 노력한 모습 좋게 봐주시면 감사하겠습니다ㅠㅠ
분명히 부족한점이 많을텐데 소스 잘 관리해주실거라 믿으며, 혹시 이 글을 보시고 나중에 만나게 된다면 커피라도 한 잔 보답드리겠습니다.