반응형
이전 포스팅에서 Dependency Injection에 대해 간단히 언급하였습니다.
본 포스팅에서는 Dagger를 사용하여 DI를 하는 간단한 예제를 보여드리고자 합니다. 이전 포스팅에서 사용한 예제 코드를 그대로 가져와봤습니다.
class MoviesPresenter(
private val moviesRepository: MoviesRepository
): MoviesContract.Presenter {
// ...
}
직접 DI를 해주게 되면 MoviesPresenter() 생성 시 MoviesRepository()를 직접 생성하여 주입해야 하는데, Dagger를 사용하게 되면 아래와 같이 작성할 수 있습니다.
class MoviesPresenter @Inject construct(
private val moviesRepository: MoviesRepository
): MoviesContract.Presenter {
// ...
}
차이점은 생성자 앞에 @Inject 어노테이션이 붙은 겁니다. 즉 MoviesRepository 객체는 Dagger가 직접 생성하여 주입해줄 거라고 명시하는 거죠. 그리고 Activity에서도 이전에는 아래와 같이 생성했다면,
class MoviesActivity: Activity(), MoviesContract.View {
lateinit var moviesPresenter: MoviesPresenter
override fun onCreate() {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_movies)
moviesPresenter = MoviesPresenter()
}
}
아래와 같이 바꿔줘야 합니다.
class MoviesActivity: Activity() {
@Inject
lateinit var moviesPresenter: MoviesPresenter
override fun onCreate() {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_movies)
// 아래 코드는 이제 더이상 필요하지 않습니다.
// moviesPresenter = MoviesPresenter()
}
}
Field Injection
위 코드는 의존성을 생성자가 아닌 필드에서 주입받고 있습니다. 이는 Activity 생성이 개발자가 작성한 코드 레벨에서 생성되는 것이 아니라 시스템 레벨에서 자동으로 생성되기 때문입니다.
Activity에서 Presenter 변수 앞에 @Inject를 붙여 주고 Presenter를 직접 생성하던 코드는 날려버리면 됩니다. 이 어노테이션으로 인해 Dagger가 알아서 객체를 생성해주기 때문이죠.
하지만 이걸로는 부족합니다. 이번엔 MoviesActivity에 의존성을 어떻게 주입해줄 수 있는지 생각해봐야 합니다. 이는 의존성 그래프를 그려 Dagger 가 의존성 주입을 할 수 있도록 알려줘야 합니다. 이 부분에 대해서는 다음 포스팅에서 다루겠습니다.
반응형
'개발 > Android' 카테고리의 다른 글
[Android] View Binding (0) | 2020.11.08 |
---|---|
[Android] Handler Memory Leak (0) | 2020.11.08 |
[Android] Dagger – intro (0) | 2020.11.08 |
[Android] Property Animation – Snowing (눈 내리기) (0) | 2020.11.08 |
[Android] Property Animation – Color (색상 변경) (0) | 2020.11.08 |