[안드로이드] Hilt

이상욱·2022년 12월 25일
0

안드로이드

목록 보기
15/17
post-thumbnail
post-custom-banner

✅ Hilt

안드로이드 의존성 주입 라이브러리로 Dagger라이브러리를 사용하는데 너무 복잡하고 어려워 구글에서 발표한 라이브러리입니다.

Hilt의 구조

동작방식

Application 내부에 생명주기랑 연동되는 component 보관함을 만들고 그 안에 의존 객체를 생성합니다. 액티비티나 프래그먼트에서 의존성 주입이 필요할 때 컴포넌트를 통해서 의존 객체를 주입합니다.

Component

  • @HiltAndroidApp
    Application
  • @HiltViewModel
    ViewModel
  • AndroidEntryPoint
    Activity
    Fragment
    View
    Service
    BroadcastReceiver

Scope

Hilt가 제공하는 의존객체는 기본적으로 UnScoped상태입니다. 요청할 때마다 새로운 객체가 만들어집니다.
이를 방지하기 위해서 각 의존객체에는 Scope라는 이름의 생명주기를 지정할 수 있는데 이 스코프의 범위를 나타내는 것이 @ScopeAnnotation입니다.
@Singleton을 붙이면 앱 전체에서 하나만 만들어지게 됩니다.

의존성 주입

  • Field injection
class AnalyticsAdapter @Inject constructor(){}

@AndroidEntryPoint
class ExampleActivity : AppCompatActivity() {
	
    @Inject lateinit var analytics : AnalyticsAdapter
}
  • Constructor injection
class AnalyticsAdapter @Inject constructor(){}

@AndroidEntryPoint
class ExampleActivity @Inject  constructor(
	var analytics : AnalyticsAdapter
) : AppCompatActivity() {}

Module

의존 객체를 담는 클래스를 Hilt에서는 Module이라는 이름으로 정의합니다. 컴포넌트 안에 모듈을 만들고 모듈 내부에 의존객체를 생성해 주입할 수 있습니다.

모듈을 정의할 때는 @Module과 @InstallIn을 사용합니다

외부 라이브러리로 부터 만들어진 인스턴스와 인터페이스인스턴스는 필드가 생성할 수 없기 때문에 @Provides와 @Bind를 사용합니다

  • @Provides
    Hilt를 통하지 않고 빌드패턴이나 외부라이브러리 인스턴스를 생성할 때는 @Provides를 사용합니다.
//모듈을 정의합니다.
@Module
//InstallIn을 통해서 Activity가 Scope로 설정됩니다.
@InstallIn(ActivityComponent::class)
object AnalyticsModule{
	
    @Provides
    fun provideAnalyticsService(
    	//Potential dependencies of this type
    ) : AnalyticsService{
    	return Retrofit.Builder()
        			.baseUrl("http:~~//")
                    .build()
                    .create(AnalyticsService::class.java)
    }
}
  • @Binds
    인터페이스를 주입하는 경우 @Binds를 사용합니다.
interface AnalyticsService{
	fun analyticsMethods()
}

class AnalyticsServiceImple @Inject constructor() : AnalyticsService{}

@Module
@InstallIn(ActivityComponent::class)
abstract class AnalyticsModule{
	@Binds
    abstract fun bindAnalyticsService(
    	analyticsServiceImple : AnalyticsServiceImpl
    ) : AnalyticsService
    
}
profile
항상 배우고 성장하는 안드로이드 개발자
post-custom-banner

0개의 댓글