Hello JetPack

2018/11/26

JetPackJetPack

안녕하세요 스윗트래커 모바일팀 KJ입니다.

안드로이드는 발전해 오면서 큰 문제들을 가지게되는데 첫번째로는 파편화, 두번째로는 라이프사이클에 의한 많은 예기지 못한 상황들이 있습니니다.

위와같은 상황을 보다 잘 대처할 수 있게 드디어 구글에서 컴포넌트와 가이드라인을 제공해주는것이 JetPack입니다.

젯팩은 쉽게 개발하기 위한 ‘안드로이드 컴포넌트 집합’ 이며
androidx.* 패키지 라이브러리로 구성되고
기존 안드로이드 플랫폼보다 자주 업데이트 될것이며, 최신 젯팩 구성요소에 액세스 할 수 있다.

빠르게 살펴보면 JetPack 공식 문서에서 보여주는 그 구성요소들은 아래와 같습니다. components 이와같이 Fundation, Architecture, Behavior, UI 크게 4가지로 나눠지며 이 중에는 이미 자신도 모르게 사용하는 컴포넌트 들도 있을 것 입니다.

  1. 안드로이드 하위 호환성 및 테스트를 위한 AppCompat, Test, Android KTX 등
  2. 안드로이드 내부적 설계를 위한 Databinding, Lifecycles, LiveData, Room , Viewmodel, WorkManager 등
  3. 알림, 권한 등을 위한 Notification, Permission, Preferences 등
  4. UI구성 요소들인 Anination, Fragment, Layout 등

그렇다면 젯팩 컴포넌트들을 사용할때 어떤 이점이 있을까요?
이번글에서는 간결함을 주는 ‘KTX’ 하나만 살짝 알아보겠습니다

Android KTX는 Kotlin 언어 기능을 활용하여 자연스러운 표현을 사용하면서 더욱 간결하고 즐겁게(?)
Kotlin을 개발 할 수 있도록 만들어졌습니다.

그럼 정말 KTX 가 간결함과 즐거움을 줄지 예제코드로 알아보겠습니다.



  • SharedPreferences
    Kotlin
    sharedPreferences.edit()
      .putBoolean("key", value)
      .apply()
    

    Kotlin KTX

    sharedPreferences.edit {
      putBoolean("key", value)
    }
    

  • Listener
    Kotlin
    view.viewTreeObserver.addOnPreDrawListener(
      object : ViewTreeObserver.OnPreDrawListener {
          override fun onPreDraw(): Boolean {
              viewTreeObserver.removeOnPreDrawListener(this)
              actionToBeTriggered()
              return true
          }
      }
    )
    

    Kotlin KTX

    view.doOnPreDraw {
      actionToBeTriggered()
    }
    

  • SQL Lite
    Kotlin
    db.beginTransaction()
    try {
      // insert data
      db.setTransactionSuccessful()
    } finally {
      db.endTransaction()
    }
    

    Kotlin KTX

      db.transaction {
      // insert data
    }
    

  • Fragment
    Kotlin
    supportFragmentManager
      .beginTransaction()
      .replace(R.id.my_fragment_container, myFragment, FRAGMENT_TAG)
      .commitAllowingStateLoss()
    

    Kotlin KTX

    supportFragmentManager.transaction(allowStateLoss = true) {
      replace(R.id.my_fragment_container, myFragment, FRAGMENT_TAG)
    }
    


개인적으로는 .commit()이나, .apply(), Listener등록 시에 불필요하게 생기는 boilerplate code들을 DSL스타일의 고차함수를 사용하여 보다 클린한 코드를 만들어주는것 같습니다.

젯팩 각 요소마다 그 요소가 가져오는 장점이 있으며
가장 큰 변경점은 구글에서 개발자에게 개발 아키텍처에 대한 가이드라인을 제시한 부분이 아닐까 싶습니다.

그래서 천천히 AAC-MVVM에 대해 공부하고 적용해보려고 합니다.

추가적인 정보로는 구글에선 빠르게 안정적인 버전의 품질 향상을 위해 Gradle버전을 올려오고 있으며

3.2버전 부터는

  • [Nacigation Editor]
  • [새로운 머테리얼 디자인]
  • [Android X 마이그레이션]
  • [코틀린 릴리즈]
  • 전후 2초정도의 스냅샷을 가지고 그 시점으로 이동 가능해진 [Emulator Snapshot]
  • 배터리 소모를 추적할 수 있는 [Energy Profiler]

등 많은 기능들이 릴리즈 되어 개발에 더 도움을 줄것입니다.
스마트택배역시 이에 발빠르게 맞춰가기위해 지속적으로 업데이트를 반영하고 있으며
더 나은 환경을 위해 하나씩 알아가고 적용하려고 합니다.
읽어주셔서 감사합니다.

다음 블로깅 예정글은 [DataBinding활용] 또는 [코틀린문법 활용하기] 또는 [aac-mvvm] 입니다.

Post Directory