프로젝트 DI 셋팅을 하기 위해 Module을 만들던 도중, 문득 어노테이션 중 @Binds를 보게 되었다. 주로 이전까지는 아무 생각없이 @Provides를 사용해왔었는데, 반성해야겠다.
공통점
@Binds : 인터페이스와 인터페이스의 구현체를 연결하는데에 사용된다.
@Provides : 종속성 객체를 생성, 제공하는 메서드를 정의할 때 사용된다. (@Binds 외의 경우)
단순히 생각해보면, 구현할 코드가 한 두줄 줄어든다...뿐이다.
@Module
class MyModule {
@Provides
fun getInjectClass(injectObject: InjectClass): InjectInterface {
return injectObject
}
}
@Module
abstract class MyModule {
@Bindes
abstract fun getInjectClass(injectObject: InjectClass): InjectInterface
}
이게 뭐...? 라는 생각이 들 때즈음 포스팅에서 내부적으로 추가 생성하는 코드들에 관한 존재를 알게 됐다.
@Provides는 @Binds가 생성하지 않는 하나의 클래스를 추가로 생성한다.
해당 클래스는 다음과 같다.
이것은 하나의 @Provides가 생성하는 추가 클래스이다. 여러개가 생성하게 된다면, 상당한 코드가 불필요하게 추가되는 것이다.
또한 @Binds vs @Provides는 주입될 객체를 생성하기 위한 로직도 차이가 난다.
그러므로 적절한 사용처에는 @Binds를 사용하는 것이, 미학적으로도 코드적으로도 좋다는 것을 의미한다.