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
반응형
'개발 > 소프트웨어 디자인 패턴' 카테고리의 다른 글
UseCase 사용의 이유, ViewModel에서 Repository를 직접 연결하면 안될까? (0) | 2025.02.21 |
---|---|
비즈니스 로직이란? 개발자가 꼭 알아야 할 핵심 개념 정리 (0) | 2025.02.20 |
설계 패턴에서 Interface와 implementation을 쓰는 이유 (0) | 2025.02.18 |
싱글톤(Singleton) 패턴과 Kotlin에서 object 객체 (1) | 2025.01.22 |
보일러 플레이트 코드 (Boilerplate Code) (0) | 2025.01.14 |