프로그래밍 놀이터/안드로이드, Java

[android] Overview - Hilt 에 대해 알아보자

돼지왕 왕돼지 2022. 1. 25. 15:26
반응형
-
DI 는 다음과 같은 장점을 제공한다.
1. 코드 재활용
2. 쉬운 리팩토링
3. 쉬운 테스트
 

DI 핵심

* DI 는 무엇인가?

 
-
클래스들은 다른 클래스들을 참조하곤 한다.
예를 들어 Car 는 Engine 을 참조할 수 있다. Engine 과 같이 참조되는 클래스들을 'dependencies' 라고 부른다.
 
-
필요로 하는 class 를 갖는 3가지 방법이 있다.
1. dependency 를 직접 만든다. 예를 들어 Car 가 Engine 을 직접 만든다.
2. 다른 곳에서 얻어온다. 안드로이드에서 Context 를 얻어오는 것이나 getSystemService API 를 호출하는 것을 생각하면 된다.
3. param 으로 전달받는다. 앱은 이 dependencies 를 제공할 수 있다. 예를 들어 Car constructor 가 Engine 을 param 으로 받는 것이다.
 
3번이 DI 이다.
 
-
1번의 방법을 tighly coupled 되었다고 말한다. 이 경우 당연히 테스트도 어렵다.
 
-
3번의 방법은 Car 를 재사용 가능하게 한다. 다른 Engine 들을 가져다 쓸 수 있다.
테스트도 쉬워진다. test 용 engine 을 전달하면 된다.
 
-
Android 에는 2가지 방법의 DI 가 있다.
1. Constructor Injection.
2. Field Injection (or Setter Injection)
    Activity, Fragment 등의 Android framework class 는 System 이 만든다. 그래서 constructor injection 이 불가능하다.
    Field injection 을 통해 class 가 생성된 후 dependency 가 init 될 수 있다.
 
 

* 자동화된 DI

 
-
다른 lib 을 사용하지 않고 DI 구조를 사용하여 쓰는 형태를 "DI by hand" 또는 "manual DI" 라고 부른다.
그러나 dependency 가 늘어날수록 다음과 같은 문제가 생긴다.
1. 큰 사이즈의 앱에서는 DI 를 구축하고 연결하면서 boilerplate 코드들이 많이 생기게 된다. 
2. dependency 를 전달하기 전 만들 수 없다면, custom container 나 graph of dependencies 를 직접 작성하고 관리해야 한다.
 
-
위와 같은 문제를 해결해주는 lib 들이 있다.
이들 lib 은 다음 두가지 형태로 작동한다.
1. Reflection-based 로 runtime 에 연결된다.
2. static 방법으로 compile time 에 코드를 만들어서 dependency 를 연결한다.
 
-
Dagger 가 Google 에서 유지보수되는 Java world 에서 유명한 DI lib 이다.
Dagger 는 완전한 static, compile-time DI lib 으로, reflection 기반 방식의 성능과 에러 이슈를 해결한다.
 
 

DI 의 대안

 
-
DI 의 대안으로 사용되는 것은 Service Locator 이다.
이는 디자인 패턴으로 concrete dependency 에 대해 decoupling 을 제공한다.
 
-
Service locator 패턴은 DI 와 다르다.
이 녀석은 class 가 inject 되는 것에 대한 제어를 하고, DI 는 app 이 inject 되는 것에 대한 제어를 한다.
 
-
Service locator 는 test 가 어렵다. global service locator 와 상호작용하기 때문이다.
또한 Dependency 가 class 안에 구현되어 있기 때문에 바깥쪽에서 어떤 class 를 요구하는지 잘 알 수 없다. 변화에 유연하지 않다는 의미이다.
Scope 관리도 쉽지 않다.
 
 

Android 에서는 Hilt 를 사용하자.

 
-
Hilt 는 Jetpack 에서 권장하는 Android 전용 DI lib 이다.
DI 의 기본을 제공하고, Android class 들의 lifecycle 도 자동으로 관리해준다.
 
-
Hilt 는 Dagger 기반으로 작성되었고, 따라서 compile time 에 DI 코드가 작성된다.
 
 
 

 

반응형