https://dagger.dev/hilt/monolithic


10.3 Design Decisions – Monolithic Components

개요

Hilt는 단일 컴포넌트 체제를 사용한다. 이것이 의미하는 점은 모든 Activity 클래스들에 의존성 주입을 하는 것에 대해 단일 Activity 컴포넌트의 정의가 사용된다는 것이다. Fragment와 다른 안드로이드 타입들도 같은 맥락이다. 각 Activity는 분리된 컴포넌트 인스턴스를 갖지만, 정의된 컴포넌트 클래스는 공용된다. 이는 각 Activity가 분리된 컴포넌트 정의를 갖는 다형적 컴포넌트 체제와는 반대된다. dagger.android의 @ContributesAndroidInjector를 사용할 때는 다형적 체제를 기본적으로 사용한다. 이 페이지는 Hilt가 두가지 모델 사이에서 몇가지 트레이드 오프와 함께 단일 컴포넌트를 채택하여 설계된 이유에 대해서 알아본다.

단일 바인딩 키 공간

Hilt에서 단일 체제를 사용하는 주된 이유 중 하나는 바인딩 키 공간이 통합된다는 점이다. Fragment에 Foo클래스를 주입한다고 가정하면, Fragment가 어느 Activity에 붙었는지에 따라 다르지 않기 때문에 Foo바인딩이 어디로 부터 왔는지 찾기가 쉬워진다. 다형 체제는 Activity마다 다른 바인딩을 정의하여 더 나은 유연성을 제공하지만, 이는 보통 코드량이 더 많아지고 추적하기 힘들어 지기 때문에 혼란을 야기한다.

바인딩들을 사용해야 하는 코드에만 바인딩을 private으로 유지하려면, 제한된 가시성을 통해 보호되는 한정자를 사용하거나 SPI 플러그인을 사용하여 코드를 분리하는 것이 좋다.

간단한 설정

단일 바인딩 키 공간은 설정을 매우 쉽게 만든다. 이는 모듈이 설치될 수 있는 곳을 줄이기 때문에 테스트를 위해 바인딩을 쉽게 교체할 수 있게 한다. 이런 부분은 해당 기능을 사용하는 모든 곳에 대해 모듈을 전파하는 점을 걱정 할 필요가 없다는 것을 의미한다. 이것은 다른 스코프 를 사용하는 기능들에 대해 정말 유용할 수 있다. 다형성의 세계에서 보면 Fragment 스코프 내 객체와 Activity 스코프 내 객체를 사용하는 기능은 개발자가 Fragment에 모듈을 포함시킨 다음 해당 Fragment를 사용하는 모든 Activity에 포함시켜야 한다. 종종 이러한 코드 설정은 보일러플레이트 코드를 더하고 캡슐화를 깨뜨린다.

생성되는 코드 줄이기

단일 체제를 사용하면 생성되는 코드를 줄일 수 있다. 일반적으로 모듈이 여러 서브 컴포넌트에서 사용되면(일반적인 Activity 헬퍼 클래스의 경우와 마찬가지로), 모든 서브 컴포넌트에 대해 Dagger 코드가 반복적으로 생성되어야 한다. 이게 처음엔 별거 아닌 것 같지만, 많은 Activity들을 통해 빠르게 더해지고, 많은 Fragment 또는 View로 인해 급격하게 늘어 날 수 있다.

fastinit 및 시작 대기시간

일부 개발자들은 이것이 어떻게 시작 대기시간(startup latency)에 영향을 미치는지 걱정할 것이다. 만약 fastinit 컴파일 옵션을 사용하고 있다면, 단일 컴포넌트는 시작 대기시간에 눈에 띌만한 영향을 주지 못한다. 이는 그레이들을 사용하여 Hilt를 사용하는 경우 기본값이며, 일반적으로 안드로이드에서 사용되는 Dagger 컴파일모드여야 한다.

카테고리: Dagger2

0개의 댓글

답글 남기기

Avatar placeholder

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