Hilt를 이용한 DI(의존성 주입) 방법 (2)

WonDDak·2022년 9월 27일
0

Hilt

목록 보기
2/2

Hilt 적용하기

gradle에 세팅이 끝났다면 설정을 진행해보자
생각보다 어렵지 않으니 다음을 따라해보길 바란다.

Application 설정

먼저 Application을 상속받는 class를 하나 만들어 다음과 같이 설정해 주자.

@HiltAndroidApp
class MyApp :Application() {

}

@HiltAndroidApp 이라는 어노테이션으로 나는 hilt를 쓸꺼에요~ 라고 선언한다고 생각하면 된다.

manifest에도 등록하는것을 잊지말자

...
    <application
        android:name=".MyApp"
...
    </application>

Hilt는 현재 다음 Android 클래스를 지원한다.

  • Application(@HiltAndroidApp을 사용하여)
  • ViewModel(@HiltViewModel을 사용하여)
  • Activity
  • Fragment
  • View
  • Service
  • BroadcastReceiver

Activity/Fragment 에서의 사용

Activty / Fragment 에서 사용하기 위해서는 @AndroidEntryPoint 어노테이션을 사용하면 된다.
이는 나는 여기에 주입을 할거에요~ 라고 선언한다 생각하면된다.

@AndroidEntryPoint
class MainActivity : AppCompactActivity() {

}
@AndroidEntryPoint
class MainFragment : Fragment() {

}

inject(주입) 하기

주입방법은 간단하다.

@AndroidEntryPoint
class MainActivity : AppCompactActivity() {

	@Inject lateint var myModule : MyModule

}

@Inject 를 통해 주입시킬수있으며, 주입되는 대상은 private할 수 없다.

class에서 사용하기

class AnalyticsAdapter @Inject constructor(
  private val service: AnalyticsService
) { ... }

@Inject construcotr()을 이용하여 주입이 가능하다.

위의 코드의 경우 AnalyticsService에 대한 제공방법 또한 알고있어야한다.

ViewModel에서 사용하기

위의 class 생성과 동일하나 @HiltViewModel 어노테이션을 추가해준다.

@HiltViewModel
class MyViewModel
@Inject constructor(
    private val myRepository: MyRepository,
) : ViewModel() {
}

Module 정의 하기

@Binds 와 @Provides 두개가 있다.
@Module 어노테이션을 통해 모듈임을 알려주고
InstallIn을 통해 설치 위치를 정한다

Hilt 구성요소인젝터 대상
SingletonComponentApplication
ActivityRetainedComponentN/A
ViewModelComponentViewModel
ActivityComponentActivity
FragmentComponentActivity
ViewComponentView
ViewWithFragmentComponent@WithFragmentBindings 주석이 지정된 View
ServiceComponentService

@Binds를 사용하여 인터페이스 인스턴스 삽입

인터페이스를 주입시킬때 사용한다. (애는 별로 사용을 안해봐서 잘모르겠다.)

  • 함수 반환 유형은 함수가 어떤 인터페이스의 인스턴스를 제공하는지 Hilt에 알려줍니다.
  • 함수 매개변수는 제공할 구현을 Hilt에 알려줍니다.
interface AnalyticsService {
  fun analyticsMethods()
}

// Constructor-injected, because Hilt needs to know how to
// provide instances of AnalyticsServiceImpl, too.
class AnalyticsServiceImpl @Inject constructor(
  ...
) : AnalyticsService { ... }

@Module
@InstallIn(ActivityComponent::class)
abstract class AnalyticsModule {

  @Binds
  abstract fun bindAnalyticsService(
    analyticsServiceImpl: AnalyticsServiceImpl
  ): AnalyticsService
}

09.30 추가
인터페이스를 주입시킬때 어떻게 적용시킬수 알수 없기때문에 class를 만들어 주입할수 있게 합니다.

@Provides를 사용하여 인스턴스 삽입

주로 사용하는듯하다, Retrofit,Room같은 것도 모듈화 시켜 주입이 가능하다.

  • 함수 반환 유형은 함수가 어떤 유형의 인스턴스를 제공하는지 Hilt에 알려줍니다.
  • 함수 매개변수는 해당 유형의 종속 항목을 Hilt에 알려줍니다.
  • 함수 본문은 해당 유형의 인스턴스를 제공하는 방법을 Hilt에 알려줍니다. Hilt는 해당 유형의 인스턴스를 제공해야 할 때마다 함수 본문을 실행합니다.
@Module
@InstallIn(ActivityComponent::class)
object AnalyticsModule {

  @Provides
  fun provideAnalyticsService(
    // Potential dependencies of this type
  ): AnalyticsService {
      return Retrofit.Builder()
               .baseUrl("https://example.com")
               .build()
               .create(AnalyticsService::class.java)
  }
}

Provide 형태로 가장 많이 만들어 쓰는듯 하다

profile
안녕하세요. 원딱입니다.

0개의 댓글