본문 바로가기

안드로이드

[Android] 4. 구글 코드랩 Dagger를 이용한 리팩토링 - Registration Flow

개요

해당 게시글은 구글 코드랩 문서의 번역 게시글입니다.

 

액티비티에 그래프 주입하기

안드로이드에서 앱이 동작하는 동안 그래프가 메모리에 상주하기를 원하기 때문에 일반적으로 Application 클래스에 Dagger 그래프를 만든다. 이 방식으로 그래프가 앱의 수명주기에 연결된다. 또한 Applicatoin Context를 사용할 수 있다. 장점으로 그래프는 다른 안드로이드 프레임워크의 클래스를 Context를 통해 이용할 수 있으며 테스팅에도 용이하다.

 

그래프 객체(i.e. AppComponent)를 새로 생성한 custom Application인 MyApplication에 주입하자.

 

MyApplication.kt

open class MyApplication : Application() {

    // AppComponent 객체가 어느 Activity에서도 사용할 수 있게 된다.
    val appComponent: AppComponent by lazy {
        // 팩토리 생성자로 AppComponent를 새엉한다.
        //applicationContext 전달하여 그래프에서 Context를 사용할 수 있게 한다.
        DaggerAppComponent.factory().create(applicationContext)
    }

    open val userManager by lazy {
        UserManager(SharedPreferencesStorage(this))
    }
}

이전 포스팅에서 언급한 것 처럼, 대거는 AppComponent의 내용을 포함하고 있는 DaggerAppComponent를 생성했다. 따라서 정의한 @Component.Factory에 의해  DaggerAppComponent의 정적 메소드인 .factory()를 호출할 수 있다. 이를 통해 Context를 전달하는 create 메소드를 호출할 수 있게 된다.

 

 

이제 RegistrationActivity에서 해당 그래프 인스턴스를 사용하여 대거가 @Inject로 주석이 달린 필드 멤버를 주입할 수 있게 된다. 이를 위해서는 AppComponent에 정의한 inject 메소드를 호출해야한다. 추가로 주입된 객체를 초기화하는 코드를 제거해야 한다.

 

RegistrationActivity.kt

class RegistrationActivity : AppCompatActivity() {

    // @Inject 처리된 변수는 대거에 의해 제공된다.
    @Inject lateinit var registrationViewModel: RegistrationViewModel

    override fun onCreate(savedInstanceState: Bundle?) {

        // 대거에게 의존성 주입을 요청한다.
        (application as MyApplication).appComponent.inject(this)

        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_registration)

        // 아래 초기화 라인을 지우세요
        registrationViewModel = RegistrationViewModel((application as MyApplication).userManager)

        supportFragmentManager.beginTransaction()
            .add(R.id.fragment_holder, EnterDetailsFragment())
            .commit()
    }

    ...
}

 

중요사항: 액티비티를 사용할 때, 프래그먼트 복원 이슈를 피하기 위해서는 super.onCreate를 호출하기 전에 대거에게 인젝션을 요청해야 한다. super.onCreate에서 액티비티가 복원을 수행하는 동안에 액티비티 바인딩에 접근할 수 있는 프래그먼트를 붙이게 된다.

 

위를 통해 RegistrationActivity는 Dagger를 사용하여 의존성을 관리받는다. 이제 앱을 실행할 수 있게 된다. 하지만, Registration 흐름 이후에 메인 페이지가 나타나야 하지만 Login이 진행된다. 왜냐면 아직 다른 흐름은 대거 그래프를 사용하고 있지 않기 때문이다.

 

MainActivity의 경우 아직 MyApplication에 정의된 UserManager를 사용하고 있기 때문에 대거가 생성한 UserManager와 일치하지 않는다.