[안드로이드스튜디오_문화][Hilt 표준 컴포너트]

기말 지하기포·2024년 1월 13일
0

Hilt 계층 구조

-Hilt는 표준 컴포넌트를 제공하기 때문에 개발자가 직접 컴포넌트를 정의하지는 않는다. 굳이 하겠다면 custom 컴포넌트를 정의하려면 정의 할 수 있기는 하지만 굳이 사용 안한다.

-각 컴포넌트 계층 이미지에 보이는 각각의 Component의 명칭 위에 있는 ???Scoped 어노테이션은 해당 컴포넌트의 생명주기에 대한 의존성범위를 지정할 때 사용되는 Annotation이다.

-화살표가 아래방향으로 향하고 있는데 이 Component간의 화살표 방향은 하위 컴포넌트를 가르키는 것을 의미한다. 일반적으로 하위 컴포넌트는 상위 컴포넌트의 바인딩에 접근 할 수 있다. 하지만 상위 컴포넌트는 상위 컴포넌트의 바인딩에 접근 할 수 없다. 이러한 의존관계 또한 컴파일단에서 전부 체크하므로 문제가 있으면 빌드를 중단시키고 런타임의 안정성을 확보한다.

Hilt 컴포넌트

-필드 삽입을 실행할 수 있는 각 Android 클래스마다 @InstallIn 주석에 참조할 수 있는 관련 Hilt 구성요소가 있다. 각 Hilt 구성요소는 해당 Android 클래스에 결합을 삽입해야 한다.

-Application 클래스를 위한 SingletonComponent를 제외하고는 안드로이드 컴포넌트에서는 AndroidEntryPoint 어노테이션을 통해서 아래와 같은 컴포넌트 들을 생성해서 의존성을 주입할 수 있다. 이로서 각각의 안드로이드 컴포넌트들은 독립적으로 의존성을 주입받을 수 있게 된다.

  • ViewModelComponent(ViewModel)
  • ActivityComponent(Activity)
  • FragmentComponent(Fragment)
  • ViewComponent(View)
  • ViewWithFragmentComponent(View with @WithFragmentBindings)
  • ServiceComponent(Service)

Hilt Component 생명주기

-Hilt Component의 생명주기는 해당 컴포넌트에 바인딩 된 의존성들의 수명과 관련이 있다. 위의 도표를 보면 Hilt Component가 언제 생성이 되고 언제 소멸이 되는지 알 수 있다. 안드로이드 컴포넌트에서 의존성 주입을 시도 할 때 Hilt Component가 인스턴스화 되기 이전 또는 이후에 의존성 주입을 시도하면 에러가 발생 할 수 도 있다. 따라서 Hilt Component의 생성 소멸을 반드시 알고 있어야 한다.

Scope Vs Unscope

-Hilt에서는 Scope Annotation을 사용하지 않으면 매번 새로운 인스턴스를 생성할 것을 암시한다.

-Hilt를 사용할 때 각각의 의존성 주입 요청에 대해 매번 새로운 인스턴스를 생성하는 대신, Scope Annotation을 사용하면 특정 범위 내에서 동일한 인스턴스를 재사용할 수 있다.

-만약 Scope Annotation을 마킹하면 의존성은 Scope에 해당하는 컴포넌트 생명주기 동안에 동일하게 참조가 된다. 즉, @???Scoped 어노테이션이 마킹이 되면 해당 Hilt 컴포넌트의 생명주기 동안 매 요청에 대해서 동일한 인스턴스의 반환을 보장한다. 그러나 실제로 모든 컴포넌트에서 동일한 인스턴스를 반환하고 싶으면 더 상위 레벨의 컴포넌트에 Scope를 마킹해야 한다.

Scope Annotation 사용 시기

-1. 의존성을 인스턴스화하는 비용이 클 때

-2.동일한 인스턴스를 반환하고 싶을 때

-3.특정 인스턴스를 공유하고 싶을 때

기본적으로 제공되는 바인딩


-위의 사진은 Hilt에서 Component가 기본적으로 제공하는 바인딩을 나타내는 사진이다.

-개별적인 HiltComponent들은 몇가지 기본 바인딩을 제공한다.
-Component는 그냥 생략하고 생각하면 된다.

  • SingletonComponent : 애플리케이션 전체에 걸쳐 단일 인스턴스를 유지한다.
@Singleton
@Component(modules = [...])
interface AppComponent {
  > Application context를 주입할 때 사용한다.
  fun inject(application: Application)
}
  • ActivityRetainedComponent : 액티비티가 종료되고 재생성될 때까지 데이터를 유지하기 위해 사용한다.

  • ViewModelComponent : SavedStateHandle과 함께 뷰 모델의 상태를 관리하고 유지하는 데 사용한다.

  • ActivityComponent : 액티비티의 생명주기에 맞춰 의존성을 관리할 때 사용한다.

  • FragmentComponent : 액티비티와 프래그먼트가 공유하는 의존성을 관리할 때 사용한다.

  • ViewComponent : 뷰 내에서 사용될 의존성을 관리할 때 사용한다.

@HiltViewModel
class MyViewModel @Inject constructor(
  val savedStateHandle: SavedStateHandle,
  val repository: UserRepository
) : ViewModel() {
  > ViewModel과 관련된 의존성을 주입할 때 사용한다.
}
  • ViewWithFragmentComponent : 뷰와 프래그먼트가 복잡하게 얽혀 있을 때 사용한다.

  • ServiceComponent : 백그라운드 작업이나 장기 실행 서비스에 대한 의존성을 관리할 때 사용한다.

@AndroidEntryPoint
class MyService : Service() {
  > Service에 필요한 의존성을 주입한다.
  @Inject lateinit var notificationManager: NotificationManager
}
profile
포기하지 말기

0개의 댓글