선생님, 개발을 잘하고 싶어요.

[Hilt] 안드로이드 Hilt 사용해보기, (아직 쓰지 말자...) 본문

개발/android 개발

[Hilt] 안드로이드 Hilt 사용해보기, (아직 쓰지 말자...)

알고싶은 승민 2020. 7. 5. 21:12

도입

 

What’s new in Jetpack

Android Jetpack is a suite of libraries aimed at helping you write high-quality apps easily, supporting older versions of the Android OS…

medium.com

구글에선 안드로이드 의존성 주입 라이브러리로 Dagger를 밀고 있습니다. 예전에 포스팅으로 Dagger의 컨샙에 대해서 다룬 적이 있는데요. [Dagger2 알아 보기]

 

이번에 안드로이드 11 소식과 함께 Jetpack에도 새로운 변화가 생겼습니다. 그 중에서 Hilt라는 녀석이 제 눈길을 끌었는데요. Dagger를 대채하는 차세대 의존성 주입 라이브러리 라고 보시면 되겠습니다!

 

기존에 Dagger는 안드로이드에서 사용하려면 불편한 점, 보일러 플레이트 코드가 많이 있었는데, 이를 개선하고 안드로이드 특화 의존성 주입 라이브러리라고 하길래 기대하며 알아보았습니다.

 

코드랩

요즘에 구글은 라이브러리 하나를 발표할 때, 관련 자료를 많이 던저주는데요. 그 중에 코드랩으로 라이브러리 사용을 연습할 수 있는 튜토리얼을 제공하는 편입니다.

 

그래서 한 번 따라하며 정리한 내용입니다.

 

Container: 의존성을 제공하는 객체

     -> ServiceLocator로 구현 할 수 있으나 보일러 플레이트 코드가 많이 생기고, 확장성이 적다.

 

@HiltAndroidApp를 애플리케이션 클래스에 붙히자.

     -> Hilt 의존성이 애플리케이션 라이프사이클에 묶인다.

 

@AndroidEntryPoint: 의존성을 받아 보고자 하는 안드로이드 컴포넌트에 작성해 준다.

Activity, Fragment, View, Service, BroadcaseReceiver 에서만 동작한다.

@Inject를 이용해서 Container로부터 의존성을 주입 받는다.

 

@Scope: Dagger의 Scope와 동일한 의미

 

@Singleton: Application 라이프 사이클에서 유일한 객체 생성

@ActivityScoped: Activity 라이프 사이클에서 유일한 객체 생성

 

미리 정의된 Scope의 정보는 공식 홈페이지를 참조 

컴포넌트와 스코프 사이의 관계

 

@Module: 다양한 타입들을 어떻게 Hilt가 제공하는가 명세

@InstallIn: 어떤 컴포넌트에서 제공할 모듈인지 명세

@Qualifiers: 같은 타입의 다른 인스턴스를 제공하고 싶다면?

그래서 사이드 프로젝트에...

Dagger를 사용해보신 분이라면 Hilt의 어노테이션 시스템을 이해하는게 어렵지 않습니다. 그리고 많은 보일러 플레이트 코드를 지울 수 있다는 희망에 차게 됩니다. 

쉽다... 강하다...!

그래서 희망에 차서 사이드 프로젝트에 실제로 적용해 봤습니다만,,, 쉽지 않았습니다.

 

Dagger와 공존하며 마이그레이션이 불가능 하다.

말 그대로입니다. 일부 모듈만 Hilt를 사용하는 것이 불가능합니다. Hilt도 어노테이션에 따라 별도의 코드를 생성하고 주입하기 때문입니다.

모든 @Module에 @InstallIn 이 붙어야만 한다.

 

@AndroidEntryPoint를 사용하는 클래스는 생성자 있는 Base 클래스를 사용할 수 없다.

Null reference used for synchronization

이 에러가 뜬다면, 당신의 Base Class를 살펴보세요. 혹시 생성자가 있나요? 그렇다면 동작하지 않습니다 -ㅅ-

https://github.com/google/dagger/issues/1904 (관련 이슈)

 

결론

코드랩과 공식 문서는 흥미롭지만 그래도 아직 알파는 알파인 것 같아요. 기존 프로젝트에 소프트하게 랜딩하기는 어렵지 않나 생각되네요 ㅠ (하루 종일 날림)

 

그래도 Hilt가 그리는 미래의 안드로이드 의존성 주입 개념은 마음에 듭니다. 안드로이드 특성상 컴포넌트의 라이프사이클 관련된 처리를 하는게 번거롭기 때문에 이를 고려한 의존성 라이브러리의 등장은 언제나 환영 할 만 한 것 같습니다. :)

 

참고 자료

블로그: http://joebirch.co/android/exploring-dagger-hilt-application-level-code-generation/

공식 블로그: https://medium.com/androiddevelopers/dependency-injection-on-android-with-hilt-67b6031e62d

공식 홈페이지: https://developer.android.com/training/dependency-injection/hilt-android

코드랩: https://codelabs.developers.google.com/codelabs/android-hilt/

https://developer.android.com/training/dependency-injection/hilt-android#component-scopes

Comments