dagger의 @binds 활용

dagger에서 추가적으로 알아두면 좋은 어노테이션들이 있다

 

이 포스팅에서 설명하는 @binds는 몰라도 dagger를 사용하는데 전혀 지장이 없지만

 

이 어노테이션을 사용했을때 훨씬 깔끔하고 적은 코드만으로 원하는 목표를 달성할수 있기때문에

 

알아두면 좋다

 

 

@Binds 어노테이션


dagger에게 인터페이스를 공급할때 어떤 구현체가 필요한지 알려줄수 있다


@Binds 어노테이션은 반드시 abstract function에 쓰여야한다


abstract function의 리턴타입은 우리가 공급하려고 하는 구현체의 인터페이스여야 한다

 

설명만으로는 다소 부족하니 코드를 보자

 

 

 

무언가를 저장할수 있는 Storage라는 인터페이스가 있다

 

저장되는 공간에 따라 우리는 다양한 Storage를 구현한 구현체를 만들수 있다

 

android의 SharedPreference를 사용하는 Storage의 구현체인 SharedPreferencesStorage라는 클래스를 만들었다

 

그리고 dagger가 이를 알수 있도록 @Inject 어노테이션을 통해 생성자 주입을 준비했다

 

 

그런데 아마도 실제로 이 Storage를 사용하는 코드에서는

 

SharedPreferencesStorage 타입의 클래스를 파라메터로 받는 클래스가 아니라

 

추상화된 Storage 클래스를 파라메터로 받을것이다

 

그래야지만 다양한 종류의 Storage 구현체를 인자로 받아 Storage로서의 역할을 수행하게끔 할것이기 때문이다

 

 

그렇다면 dagger에게 SharedPreferencesStorage라는 타입 말고 Storage라는 타입으로 리턴하는 의존성을 어떻게 알려주면 될까?

 

 

당연히 우리는 이미 @Provides 어노테이션에 대해 배웠기 때문에

 

@Provides 함수를 이용해서 위와 같이 구현할수 있다

 

 

하지만 좀 더 간단하게 @Binds라는 어노테이션을 활용할수 있다

 

추상 클래스와 추상 메소드를 사용해서 리턴값으로 원하는 리턴타입을 선택하면

 

@Provides로 구현했던것과 동일하게 구현할수 있다

 

하지만 dagger 내부적으로 code를 생성할때는 @Binds를 사용하는 편이 훨씬 적은 코드를 생산해내고 효율성도 좋다

 

 

 

Tag :

| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | ··· | 1813 |