이전 포스팅에서 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 가 의존성 주입을 할 수 있도록 알려줘야 합니다. 이 부분에 대해서는 다음 포스팅에서 다루겠습니다.


0 Comments

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다