본문 바로가기

안드로이드

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

개요

해당 게시글은 구글 코드랩을 번역한 게시글입니다.

 

Using Scope

가끔 한 컴포넌트에서 같은 객체를 의존성 주입해야하는 상황이 존재한다.

  1. 다른 곳에서 같은 인스턴스를 공유하기 원할 때 (e.g. UserManager)
  2. 객체 자체를 생성한는 데 매우 많은 비용이 소모되어 의존성 주입 시 마다 새로운 객체 생성을 원치 않을 때 (e.g. Json Parser)

Scope를 이용하여 컴포넌트에서 고유한 객체를 가지는게 가능해진다. 혹은 "컴포넌트의 수명주기로 타입을 스코핑한다"라고 말한다. 이 의미는 해당 타입을 제공할 때 마다 같은 인스턴스를 제공하는 것을 의미한다.

 

AppComponent의 경우 @Singleton Scope를 활용할 수 있다. 컴포넌트에 @Singleton으로 Scoping하면 @Singleton으로 처리된 모든 클래스 역시 수명 주기로 지정된다.

 

AppComponent.kt

@Singleton
@Component(modules = [StorageModule::class])
interface AppComponent { ... }

이제부터 @Singleton 주석이 달린 클래스는 AppComponent로 범위가 지정되며 동일한 객체 주입을 보장한다. 즉, @Singleton 주석이 달린 클래스는 AppComponent의 수명 주기 동안 같은 객체를 반환한다.

 

UserManager.kt

@Singleton
class UserManager @Inject constructor(private val storage: Storage) {
    ...
}

위를 통해 RegistrationActivity와 MainActivity는 동일한 UserManager를 공유하게 된다.

 

이제 다시 앱을 실행시켜 절차를 진행해보면 이전 포스팅의 버그가 해결된 것을 확인할 수 있다.

 

현재 그래프의 상태

UserManager가 하얀 점으로 표시되었다.