Hilt에 대한 자료들을 보다 보면 Dagger2에 대한 내용이 많이 나온다.
아무래도 Hilt가 Dagger2를 개선한 라이브러리다 보니 어쩔 수 없는 것 같고, 그래서 Dagger2에서 주로 사용되는 어노테이션에 대해서 정리하고자 한다.
Dagger2 어노테이션
@Module, @Provide
- @Module은 클래스에만 선언 가능
- @Provide는 반드시 @Module 클래스 안에 선언된 메소드에만 선언 가능
Module 클래스
- Module 클래스는 의존성 주입에 필요한 객체들을 Provide 메소드를 통해 관리
- 일반적으로 Module 클래스는 클래스 이름 뒤에 Module을 붙임
Provide 메소드
- 객체를 제공해 줄 메소드
- 일반적으로 Provide 메소드명 앞에는 provide를 붙임
@Module
class AModule{
@Provides
fun provideAA(): AA = AA() // AA 객체를 컴포넌트에게 제공
@Provides
fun provideBB(aa:AA): BB = BB(aa) // AA를 컴포넌트로부터 전달받아 BB를 제공
}
- provideBB 메소드의 파라미터로 지정된 AA 클래스의 객체도 @Provides로 제공하는 함수들의 반환 타입을 통해 Dagger가 알아서 주입해 줌
@Component
- Component는 객체를 생성하기 위해 제공되는 interface
- 즉, 실제로 객체를 생성 해야하는 부분에서는 Module이 아닌, Component를 호출하여 객체를 생성
- @Component는 interface 또는 abstract 클래스에 붙일 수 있음
- 컴파일 타임에 어노테이션 프로세서에 의해 생성된 클래스는 'Dagger'와 @Component가 붙은 인터페이스(또는 추상 클래스)의 이름이 합쳐진 형식의 이름을 가짐
@Component(modules = [AModule::class])
interface MyComponent { ... } // DaggerMyComponent라는 클래스가 생성됨
Component 메소드
- @Component 어노테이션이 달린 interface(또는 abstract)에는 적어도 하나의 추상 컴포넌트 메소드가 존재해야 함
- 컴포넌트 메소드에는 Provision 메소드, Member-Injection 메소드가 존재
@Component(modules = [ AModule::class, BModule::class ])
interface MyComponent [
fun makeAA(): AA // provision 메소드
fun inject(target:Main) // member-injection 메소드
}
Provision Method
- 매개변수가 없고, 모듈이 제공하는 객체의 타입을 반환형으로 가짐
- 해당 메소드를 통해 객체를 얻을 수 있음
- 함수명은 상관 없으며 생성할 객체가 AA면 return 값이 AA인 메소드를 생성
Member-Injection Method
- 의존성을 주입시킬 객체를 메소드의 파라미터로 넘기는 방법
- Member-Injection 메소드를 호출하면 타겟 클래스 내의 @Inject 필드에 객체를 주입받게 됨
@Inject
- 객체 주입을 요청하는 어노테이션
- 필드, 생성자, 메소드 등에 선언 가능
- method inject는 여러 이유에서 잘 쓰지 않는다고 한다. (이유는 추후에 알아봐야겠다.)
// AA와 BB는 MyComponent에 연결된 AModule, BModule에서 객체 생성
// MyComponent가 AModule과 BModule에서 반환 값이 AA, BB인 메소드를 찾아 객체를 가져옴
class CC @Inject constructor(val aa:AA, val bb:BB) {
fun info() { }
}
'안드로이드 > Hilt' 카테고리의 다른 글
[ Android Hilt ] Hilt 라이브러리 (1) - Dagger 기본 개념 (0) | 2023.02.03 |
---|