Dagger Hilt를 사용할 때, @Binds와 @Provides의 차이

2025. 2. 24. 17:15개발/소프트웨어 디자인 패턴

728x90
반응형

의존성을 주입할 때 Hilt에는 두가지 방법이 있다.

@Binds@Provides

이 두가지는 어떤 차이점이 있을까?


1️⃣ @Binds와 @Provides의 공통점

둘 다 의존성 주입에서 객체를 제공하는 역할을 한다.

즉, @Provides와 @Binds 모두 Hilt(Dager)가 어떤 객체를 사용할지 알 수 있도록 도와준다.


2️⃣ 차이점

✅ 객체 생성 방식

  • @Provides : 메서드에서 객체를 직접 생성 (return 사용)
  • @Binds : 이미 생성된 객체를 인터페이스에 바인딩
@Module
@InstallIn(SingletonComponent::class)
object NetworkModule {

    @Provides
    fun provideRetrofit(): Retrofit {
        return Retrofit.Builder()
            .baseUrl("https://example.com")
            .build()
    }
}
interface AnalyticsService {
    fun logEvent(event: String)
}

class FirebaseAnalyticsService @Inject constructor() : AnalyticsService {
    override fun logEvent(event: String) {
        println("Logging event: $event")
    }
}

@Module
@InstallIn(SingletonComponent::class)
abstract class AnalyticsModule {

    @Binds
    abstract fun bindAnalyticsService(
        firebaseAnalyticsService: FirebaseAnalyticsService
    ): AnalyticsService
}

✅ 사용 조건

  • @Provides : 인터페이스가 아닌 구체 클래스를 제공할 때 사용
  • @Binds : 인터페이스를 특정 구현체와 연결할 때 사용

✅ 추상 클래스 가능 여부

  • @Provides : X (객체를 직접 생성해야 하므로)
  • @Binds : O (abstract 클래스에서만 사용 가능)

✅ 어노테이션 위치

  • @Provides : @Module이 붙은 객체 클래스에서 사용
  • @Binds : @Module이 붙은 추상 클래스(abstract class)에서 사용

✅ 유지보수

  • @Provides : 직접 인스턴스를 생성하므로 변경 시 수정 필요
  • @Binds : 인터페이스만 바꾸면 되므로 유지보수 용이

3️⃣ 언제 사용해야 할까?

✅ @Provides가 필요할 때

  • 직접 객체를 생성해야 하는 경우
  • 외부 라이브러리 (ex. Retrofit, OkHttp) 같은 객체는 @Inject를 쓸 수 없으므로 @Provides 사용

✅ @Binds가 필요할 때

  • 인터페이스와 구현체를 연결해야 할 때
  • 이미 @Inject constructor()로 객체를 만들 수 있는 경우

4️⃣ 눈높이 예시

  • @Provides → 내가 직접 김밥을 만들고 친구한테 줌
  • @Binds → "김밥 먹고 싶으면 이 가게에서 사 먹어!" 하고 가게를 알려줌

유지보수를 위해서는 Binds 사용을 추천.

하지만 인터페이스 바인딩이 아닌 복잡한 객체를 만들 때는 Provides를 사용해야 함.

728x90
반응형