안녕하세요, 이번 편에서는 Pure Java/Kotlin 환경에서 Hilt를 적용할 수 없을 때 JSR-330 Annotation을 이용하여 Dependency Injection을 하는 법을 알아보려고 합니다.
이번 시리즈는 저번 시리즈들보다 짧게 다뤄질 예정입니다. 많은 내용은 없거든요.
Pure Java/Koltlin 모듈을 사용한 제 프로젝트를 예시로 들면서 알아보도록 하겠습니다.
먼저, 예시로 사용되는 프로젝트는 Multi Module Clean Architecture를 적용한 프로젝트이며, Domain Module을 Pure Java/Kotlin Module로 구성했습니다.
Domain Module에서 Dependency Injection을 적용한 것은 UseCase들입니다.
본격적으로 코드를 보여드리겠습니다.
domain/build.gradle.kts
implementation "javax.inject:javax.inject:1"
먼저 JSR-330을 사용하기 위해 javax.inject를 넣어줍니다.
domain/GetItemListUseCase.kt
@Singleton
class GetItemListUseCase @Inject constructor(
private val itemRepository: ItemRepository
) {
operator fun invoke() = itemRepository.getItems()
}
다음으로, JSR-330의 @Inject Annotation을 지정해주면 아래와 같은 클래스를 Hilt가 만들어줍니다.
app/build/generated/.../GetItemListUseCase_Factory.java
@DaggerGenerated
@SuppressWarnings({
"unchecked",
"rawtypes"
})
public final class GetItemListUseCase_Factory implements Factory<GetItemListUseCase> {
private final Provider<ItemRepository> itemRepositoryProvider;
public GetItemListUseCase_Factory(Provider<ItemRepository> itemRepositoryProvider) {
this.itemRepositoryProvider = itemRepositoryProvider;
}
@Override
public GetItemListUseCase get() {
return newInstance(itemRepositoryProvider.get());
}
public static GetItemListUseCase_Factory create(Provider<ItemRepository> itemRepositoryProvider) {
return new GetItemListUseCase_Factory(itemRepositoryProvider);
}
public static GetItemListUseCase newInstance(ItemRepository itemRepository) {
return new GetItemListUseCase(itemRepository);
}
}
이 GetItemListUseCase_Factory를 통하여 GetItemListUseCase는 다른 모듈에서 종속항목으로서 사용이 가능해집니다.
https://github.com/TaehoonLeee/multi-module-clean-architecture