DataBindingComponent와 Dagger2와 함께 사용하기

이번에 다룰 내용은 DatabindingComponent 사용하기 2탄으로 DataBindingComponent를 의존성 주입 프레임워크인 Dagger2와 함께 사용하는 방법에 대해서 알아본다.

Prerequisite

DataBindingComponent /w Dagger2

DataBindingComponent 공식 문서를 참조하면, 다음과 같은 내용이 있다.

If using Dagger 2, the developer should extend this interface and annotate the extended interface as a Component.

Dagger2를 사용하는 개발자는 이 인터페이스를 확장하고, @Component 애노테이션을 추가해 Dagger2의 컴포넌트로 활용할 수 있다는 내용이다.

당연한 이야기지만 인터페이스 기반으로 Dagger2의 프로비전 메서드와 DataBindingComponent의 getter메서드를 참조하는 구조가 같기 때문에 Dagger2를 활용할 수 있다.

DatabindingComponent 사용하기의 예제를 Dagger2를 사용한 예제로 다음과 같이 리팩토링했다.

@Component(modules = LifecycleModule.class)
public interface MyDatabindingComponent extends androidx.databinding.DataBindingComponent {
    ClickBinding getClickBinding();

    @Component.Builder
    interface Builder{
        Builder setLifecycleModule(LifecycleModule module);
        MyDatabindingComponent build();
    }
}
@Module
public class LifecycleModule {
    private Lifecycle lifecycle;

    public LifecycleModule(Lifecycle lifecycle) {
        this.lifecycle = lifecycle;
    }

    @Provides
    public ClickBinding provideClickBinding(){
        return new ClickBindingImpl(lifecycle);
    }
}

우선 ClickBindingComponent의 이름을 MyDatabindingComponent로 바꿨다. 그리고 @Component 애노테이션을 추가하고, 컴포넌트 모듈로 LifecycleModule을 새로 정의했다. 

DataBindingComponent 특성상 컴파일 타임에 모든 DataBindingComponent를 상속/구현한 모모든 getter메서드들이 DataBindingComponent 인터페이스내에 병합되기 때문에 DataBindingComponent를 하나의 안드로이드 프로젝트 모듈레벨에서 분리해서 사용하는것이 불가능하다. 그러므로 특정 클래스(여기에서는 Lifecycle이 해당)에 의존적인 바인딩어댑터와 그렇지 않은 바인딩어댑터를 함께 사용하기 위해 이를 Dagger2의 모듈로 분리하고, Dagger2 컴포넌트의 Builder를 통해 선택적으로 구현할 수 있도록 했다.

Dagger2의 컴포넌트와 모듈 구현이 끝났다면, 컴파일 타임에 DaggerMyDataBindingComponent가 생성되고, 다음과 같이 사용할 수 있다.

ActivityMainBinding binding = DataBindingUtil.setContentView(
        this,
        R.layout.activity_main,
        DaggerMyDatabindingComponent.builder()
                .setLifecycleModule(new LifecycleModule(getLifecycle()))
                .build()
);

본문의 예제는 github에서 확인 할 수 있다.

마치며

데이터바인딩과 Dagger2는 결합도를 느슨하게 만들어주는 라이브러리이며 함께 사용하면 시너지효과가 생기기 때문에 좀 더 유연하고 재사용성 및 확장성을 증대시켜주는 코드를 만들 수 있다. 

카테고리: 미분류

0개의 댓글

답글 남기기

Avatar placeholder

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