안드로이드 DI 라이브러리 중 하나인 Hilt를 적용하기 위해 Hilt에 대해 정리해보려고 한다.
Hilt는 Dagger 라이브러리를 개선한 버전이므로 먼저 Dagger를 알아야 할 것 같아서 Dagger부터 간단하게 정리해보려고 한다.
Dagger 기본 개념
- Inject
- Component
- Subcomponent
- Module
- Scope
Inject
- 의존성 주입을 요청
- @Inject 어노테이션으로 주입을 요청하면, 연결된 Componenet가 Module을 통해 객체를 생성하여 주입
Component
- 의존성을 요청받고 주입하는 Dagger의 주된 역할을 수행
- 연결된 Module을 이용하여 의존성 객체를 생성하고, @Inject로 요청받은 인스턴스에 생성한 객체를 주입
SubComponent
- Component는 계층 관계를 만들 수 있음
- SubComponent는 Inner Class 방식의 하위 계층 Component (Sub의 Sub도 가능)
- SubComponent는 Dagger의 중요한 컨셉인 그래프를 형성
- @Inject로 주입을 요청 받으면 SubComponent에서 먼저 의존성을 검색하고, 없으면 부모로 올라감
Module
- Component에 연결되어 의존성 객체를 생성
- 생성 후 Scope에 따라 관리
Scope
- 생성된 객체의 Lifecycle 범위
- 안드로이드에서는 주로 PerActivity, PerFragment 등으로 화면의 생명주기와 맞춰 사용
- @Inject 어노테이션을 통해 요청을 받으면 SubComponent에서 먼저 의존성을 검색
- SubComponent에 의존성이 존재하는 경우
- Module에서 객체를 가져옴
- SubComponent에 의존성이 존재하지 않는 경우
- 상위 Component로 올라가서 다시 검색
- SubComponent에 의존성이 존재하는 경우
- 연결된 Module이 Scope에 있으면 해당 객체를 return, 없으면 생성 (?)
Dagger 예시
아래 사진과 같이 UserRepository가 UserLocalDataSource와 UserRemoteDataSource의 인스턴스를 가지는 경우
// @Inject lets Dagger know how to create instances of this object
class UserRepository @Inject constructor(
private val localDataSource: UserLocalDataSource,
private val remoteDataSource: UserRemoteDataSource
) { ... }
해당 코드는 Dagger에게 다음을 알려준다.
- @Inject 어노테이션이 달린 생성자를 사용하여 UserRepository 인스턴스를 만드는 방법
- UserLocalDataSource와 UserRemoteDataSource가 종속 항목이라는 것
이렇게 되면 Dagger는 UserRepository의 인스턴스는 생성할 수 있지만, 종속 항목인 UserLocalDataSource와 UserRemoteDataSource의 인스턴스는 만들 줄 모른다.
UserLocalDataSource와 UserRemoteDataSource에도 각각 @Inject를 선언하면 Dagger가 인스턴스를 만들 수 있게 된다.
// @Inject lets Dagger know how to create instances of these objects
class UserLocalDataSource @Inject constructor() { ... }
class UserRemoteDataSource @Inject constructor() { ... }
'안드로이드 > Hilt' 카테고리의 다른 글
[ Android Hilt ] Hilt 라이브러리 (2) - Dagger 어노테이션 정리 (0) | 2023.02.04 |
---|