๐Ÿ“ŒDagger-Hilt ์–ด๋…ธํ…Œ์ด์…˜ ์ •๋ฆฌ

LoyalFlowerยท2025๋…„ 3์›” 5์ผ

Android์—์„œ Hilt๋ฅผ ํ™œ์šฉํ•œ ์˜์กด์„ฑ ์ฃผ์ž…(DI)์„ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์–ด๋…ธํ…Œ์ด์…˜์„ ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.


1. Hilt์˜ ํ•ต์‹ฌ ์–ด๋…ธํ…Œ์ด์…˜

Hilt๋Š” Dagger 2 ๊ธฐ๋ฐ˜์˜ ์˜์กด์„ฑ ์ฃผ์ž… ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, Android์—์„œ DI๋ฅผ ๋” ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค๋‹ˆ๋‹ค.
๋‹ค์Œ์€ Hilt์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ฃผ์š” ์–ด๋…ธํ…Œ์ด์…˜๊ณผ ์—ญํ• ์„ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.


2. Hilt ์ปดํฌ๋„ŒํŠธ ๊ด€๋ จ ์–ด๋…ธํ…Œ์ด์…˜

์ด ์–ด๋…ธํ…Œ์ด์…˜๋“ค์€ Hilt๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ ๋ฐ ์˜์กด์„ฑ์˜ ๋ฒ”์œ„๋ฅผ ์„ค์ •ํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ @HiltAndroidApp

  • Application ํด๋ž˜์Šค์— ์„ ์–ธํ•ด์•ผ ํ•˜๋ฉฐ, Hilt์˜ ์ง„์ž…์  ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
  • Hilt๊ฐ€ ์ž๋™์œผ๋กœ DI๋ฅผ ์„ค์ •ํ•˜๊ณ  ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
@HiltAndroidApp
class MyApplication : Application()

๐Ÿ“Œ @AndroidEntryPoint

  • Activity์—์„œ Hilt๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ด ์–ด๋…ธํ…Œ์ด์…˜์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
@AndroidEntryPoint
class MainActivity : AppCompatActivity()

๐Ÿ“Œ @HiltViewModel

  • ViewModel์—์„œ Hilt๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜์กด์„ฑ์„ ์ฃผ์ž…๋ฐ›์„ ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
@HiltViewModel
class MyViewModel @Inject constructor(private val repository: MyRepository) : ViewModel()

๐Ÿ“Œ @EntryPoint

  • Hilt์—์„œ ๊ด€๋ฆฌ๋˜์ง€ ์•Š๋Š” ํด๋ž˜์Šค(์˜ˆ: WorkManager, BroadcastReceiver)์—์„œ ์˜์กด์„ฑ์„ ์ฃผ์ž…๋ฐ›์„ ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
@EntryPoint
@InstallIn(SingletonComponent::class)
interface WorkerEntryPoint {
    fun getRepository(): MyRepository
}

3. ๋ชจ๋“ˆ ๋ฐ ๋ฐ”์ธ๋”ฉ ๊ด€๋ จ ์–ด๋…ธํ…Œ์ด์…˜

Hilt์—์„œ ์˜์กด์„ฑ์„ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •์˜ํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ž…๋‹ˆ๋‹ค.

๐Ÿ“Œ @Module

  • Hilt์—์„œ ์˜์กด์„ฑ์„ ์ œ๊ณตํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๋Š” ๋ชจ๋“ˆ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
@Module
@InstallIn(SingletonComponent::class)
object AppModule {
    @Provides
    fun provideString(): String = "Hello, Dagger Hilt!"
}

๐Ÿ“Œ @InstallIn

  • ํ•ด๋‹น ๋ชจ๋“ˆ์ด ์–ด๋А ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉํ• ์ง€๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
@Module
@InstallIn(SingletonComponent::class)
object NetworkModule

๐Ÿ“Œ @Provides

  • Hilt์—์„œ ์ง์ ‘ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
@Provides
fun provideApiService(): ApiService = ApiServiceImpl()

๐Ÿ“Œ @Binds

  • ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„์ฒด๋ฅผ ์—ฐ๊ฒฐํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋ฉฐ, ๋ฐ˜๋“œ์‹œ abstract ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
@Module
@InstallIn(SingletonComponent::class)
abstract class RepositoryModule {
    @Binds
    abstract fun bindRepository(impl: RepositoryImpl): Repository
}

๐Ÿ“Œ @BindsInstance

  • Hilt ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ํŠน์ • ๊ฐ’์„ ๋ฐ”์ธ๋”ฉํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
@BindsInstance
fun bindBaseUrl(@Named("BASE_URL") baseUrl: String): Builder

4. ์˜์กด์„ฑ ์ฃผ์ž… ๊ด€๋ จ ์–ด๋…ธํ…Œ์ด์…˜

์‹ค์ œ ๊ฐ์ฒด๊ฐ€ ์ฃผ์ž…๋˜๋Š” ๋ฐฉ์‹๊ณผ ๊ด€๋ จ๋œ ์–ด๋…ธํ…Œ์ด์…˜์ž…๋‹ˆ๋‹ค.

๐Ÿ“Œ @Inject

  • ์ƒ์„ฑ์ž์— ์„ ์–ธํ•˜์—ฌ ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
class Repository @Inject constructor(private val apiService: ApiService)

๐Ÿ“Œ @Named

  • ๊ฐ™์€ ํƒ€์ž…์˜ ์—ฌ๋Ÿฌ ์˜์กด์„ฑ์„ ๊ตฌ๋ถ„ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
@Provides
@Named("API_URL")
fun provideApiUrl(): String = "https://example.com"
class ApiService @Inject constructor(@Named("API_URL") private val apiUrl: String)

๐Ÿ“Œ @Qualifier

  • @Named์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ, ์‚ฌ์šฉ์ž ์ง€์ • ์–ด๋…ธํ…Œ์ด์…˜์„ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class LocalDataSource

@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class RemoteDataSource

5. Hilt์˜ ์Šค์ฝ”ํ”„ ๋ฐ ์ƒ๋ช…์ฃผ๊ธฐ ๊ด€๋ จ ์–ด๋…ธํ…Œ์ด์…˜

Hilt์—์„œ ํŠน์ • ๋ฒ”์œ„์— ๋งž๊ฒŒ ๊ฐ์ฒด๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ž…๋‹ˆ๋‹ค.

๐Ÿ“Œ @Singleton

  • ์‹ฑ๊ธ€ํ†ค ๋ฒ”์œ„์—์„œ ๊ฐ์ฒด๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
@Provides
@Singleton
fun provideDatabase(): AppDatabase = Room.databaseBuilder(...)

๐Ÿ“Œ @ViewScoped

  • View์˜ ์ƒ๋ช…์ฃผ๊ธฐ์— ๋งž์ถฐ ๊ฐ์ฒด๋ฅผ ์œ ์ง€ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. (Compose์—์„œ ์œ ์šฉ)
@ViewScoped
@Provides
fun provideViewScopedRepository(): ViewScopedRepository

6. ๊ธฐํƒ€ ์œ ์šฉํ•œ ์–ด๋…ธํ…Œ์ด์…˜

์–ด๋…ธํ…Œ์ด์…˜์„ค๋ช…
@HiltWorkerWorkManager์—์„œ Hilt๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์‚ฌ์šฉ
@EntryPointHilt์—์„œ ๊ด€๋ฆฌ๋˜์ง€ ์•Š๋Š” ํด๋ž˜์Šค์—์„œ DI๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์‚ฌ์šฉ
@ViewScopedView์˜ ์ƒ๋ช…์ฃผ๊ธฐ์— ๋งž์ถฐ ๊ฐ์ฒด๋ฅผ ๊ด€๋ฆฌ

7. Hilt ์–ด๋…ธํ…Œ์ด์…˜ ์š”์•ฝ

์–ด๋…ธํ…Œ์ด์…˜์—ญํ• 
์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ & ์—”ํŠธ๋ฆฌ ํฌ์ธํŠธ
@HiltAndroidAppApplication์—์„œ Hilt ์„ค์ •
@AndroidEntryPointActivity, Fragment ๋“ฑ์—์„œ DI ํ™œ์„ฑํ™”
@HiltViewModelViewModel์—์„œ Hilt ์‚ฌ์šฉ
@EntryPointHilt์—์„œ ๊ด€๋ฆฌ๋˜์ง€ ์•Š๋Š” ํด๋ž˜์Šค์—์„œ DI ์‚ฌ์šฉ
๋ชจ๋“ˆ & ๋ฐ”์ธ๋”ฉ
@Module์˜์กด์„ฑ์„ ์ œ๊ณตํ•˜๋Š” ํด๋ž˜์Šค
@InstallIn๋ชจ๋“ˆ์ด ์ฃผ์ž…๋  ์ปดํฌ๋„ŒํŠธ ์ง€์ •
@Provides๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜์—ฌ ์ œ๊ณต
@Binds์ธํ„ฐํŽ˜์ด์Šค - ๊ตฌํ˜„์ฒด ์—ฐ๊ฒฐ
@BindsInstance๋Ÿฐํƒ€์ž„์— ๊ฐ’์„ ์ฃผ์ž…
์˜์กด์„ฑ ์ฃผ์ž… & ์Šค์ฝ”ํ”„
@Inject์ƒ์„ฑ์ž ์ฃผ์ž… ์‚ฌ์šฉ
@Named๊ฐ™์€ ํƒ€์ž…์˜ ์—ฌ๋Ÿฌ ๊ฐ์ฒด ์ฃผ์ž…
@Qualifier์ปค์Šคํ…€ ์ฃผ์ž… ์–ด๋…ธํ…Œ์ด์…˜
@Singleton์‹ฑ๊ธ€ํ†ค ๋ฒ”์œ„ ์ง€์ •
@HiltWorkerWorkManager์—์„œ Hilt ์‚ฌ์šฉ

8. Provides์™€ Binds ๋น„๊ต

๊ณต๋ถ€ํ•˜๋ฉด์„œ ๋ฌธ๋“ ๊ทธ๋Ÿฐ ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.
๋‚˜๋Š” ์ง€๊ธˆ๊นŒ์ง€ ์ธํ„ฐํŽ˜์ด์Šค - ๊ตฌํ˜„์ฒด ์—ฐ๊ฒฐํ•  ๋•Œ @Provides๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ,
@Binds๊ฐ€ ํ•ด๋‹น ์—ญํ• ์„ ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ด๋ผ๋‹ˆ! ๊ทธ๋ž˜์„œ ๋น„๊ต๋ฅผ ํ•˜๋ คํ•œ๋‹ค.

1๏ธโƒฃ @Provides๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ

@Module
@InstallIn(SingletonComponent::class)
object RepositoryModule {

    @Provides
    fun provideRepository(apiService: ApiService): Repository {
        return RepositoryImpl(apiService)
    }
}

2๏ธโƒฃ @Binds๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ

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

    @Binds
    abstract fun bindRepository(impl: RepositoryImpl): Repository
}

โœ” @Provides vs @Binds ์ฐจ์ด์ 

๋น„๊ต ํ•ญ๋ชฉ@Provides@Binds
๋ฐ˜ํ™˜ ๋ฐฉ์‹์ง์ ‘ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด ๋ฐ˜ํ™˜์ด๋ฏธ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋ฅผ ๋ฐ”์ธ๋”ฉ
์‚ฌ์šฉ ๊ฐ€๋Šฅ ์กฐ๊ฑด์ƒ์„ฑ์ž๊ฐ€ @Inject ์—†์ด๋„ ๊ฐ€๋Šฅ์ƒ์„ฑ์ž ์ฃผ์ž…(@Inject constructor) ํ•„์ˆ˜
์ฝ”๋“œ ์Šคํƒ€์ผ์ผ๋ฐ˜์ ์ธ ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ๋ฐฉ์‹์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ ์–ธ์  ์Šคํƒ€์ผ ์œ ์ง€
ํ•„์š”ํ•œ ํ‚ค์›Œ๋“œ์ผ๋ฐ˜ fun ๋ฉ”์„œ๋“œ ์‚ฌ์šฉabstract fun ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ
์‚ฌ์šฉ ๊ถŒ์žฅ ์‹œ์ ๋ณต์žกํ•œ ๋กœ์ง์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋‹จ์ˆœํžˆ ์ธํ„ฐํŽ˜์ด์Šค - ๊ตฌํ˜„์ฒด ์—ฐ๊ฒฐํ•  ๋•Œ

๐Ÿ“Œ ๊ทธ๋Ÿผ, @Provides๋งŒ ์จ๋„ ๋˜๋Š” ๊ฑธ๊นŒ?

์•„๋‹ˆ๋‹ค. @Provides๋งŒ ์จ๋„ ๋™์ž‘์€ ํ•˜์ง€๋งŒ, ์ตœ์‹  ํŠธ๋ Œ๋“œ์—์„œ๋Š” @Binds๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉด @Binds๋ฅผ ์“ฐ๋Š” ๊ฒƒ์ด ๋” ๊ถŒ์žฅ๋˜๋Š” ๋ฐฉ์‹.

๐Ÿš€ @Binds๋ฅผ ์„ ํ˜ธํ•˜๋Š” ์ด์œ 

  1. ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ ๊ฐ์†Œ

    • @Provides๋Š” ์ง์ ‘ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•ด์„œ ์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด์งˆ ์ˆ˜ ์žˆ์Œ.
    • @Binds๋Š” ๋‹จ์ˆœํžˆ "์ด ๊ตฌํ˜„์ฒด๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์‚ฌ์šฉํ• ๊ฒŒ!" ๋ผ๊ณ  ์„ ์–ธํ•˜๋Š” ๋ฐฉ์‹์ด๋ฏ€๋กœ ๋” ๊น”๋”ํ•จ.
  2. Dagger๊ฐ€ ์ตœ์ ํ™”๋œ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Œ

    • @Binds๋Š” ๋ถˆํ•„์š”ํ•œ ๊ฐ์ฒด ์ƒ์„ฑ์„ ๋ฐฉ์ง€ํ•˜๊ณ , ์˜์กด์„ฑ ๊ทธ๋ž˜ํ”„๊ฐ€ ๋” ํšจ์œจ์ ์œผ๋กœ ๋™์ž‘ํ•˜๊ฒŒ ํ•จ.
  3. ์œ ์ง€๋ณด์ˆ˜์„ฑ ์ฆ๊ฐ€

    • @Binds๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ์–ด์„œ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ํŽธ๋ฆฌํ•จ.
    • @Provides๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์˜์กด์„ฑ ๋ณ€๊ฒฝ ์‹œ @Provides ๋ฉ”์„œ๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Œ.

๐Ÿ“Œ @Provides๋ฅผ ์จ์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” @Provides๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ•„์ˆ˜์ ์ด๊ฑฐ๋‚˜ ๋” ์ ์ ˆ.

  1. ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฐ์ฒด๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•  ๋•Œ

    • ์˜ˆ๋ฅผ ๋“ค์–ด, Retrofit, OkHttpClient, Room Database ๊ฐ™์€ ๊ฐ์ฒด๋“ค์€ ์šฐ๋ฆฌ๊ฐ€ ์ƒ์„ฑ์ž๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ @Provides๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•จ.
    @Module
    @InstallIn(SingletonComponent::class)
    object NetworkModule {
        @Provides
        fun provideRetrofit(): Retrofit {
            return Retrofit.Builder()
                .baseUrl("https://api.example.com")
                .build()
        }
    }
  2. ๊ฐ์ฒด ์ƒ์„ฑ ์‹œ ๋ณต์žกํ•œ ๋กœ์ง์ด ํ•„์š”ํ•  ๋•Œ

    • ๋งŒ์•ฝ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š”๋ฐ ์ถ”๊ฐ€์ ์ธ ๋กœ์ง(์ดˆ๊ธฐํ™”, ์„ค์ •)์ด ํ•„์š”ํ•˜๋‹ค๋ฉด @Provides๊ฐ€ ๋” ์ ์ ˆํ•จ.
    @Provides
    fun provideRepository(apiService: ApiService): Repository {
        return RepositoryImpl(apiService, enableLogging = true)
    }
    • @Binds๋Š” ๋‹จ์ˆœํ•œ ์ธํ„ฐํŽ˜์ด์Šค-๊ตฌํ˜„์ฒด ์—ฐ๊ฒฐ์„ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋ฏ€๋กœ, ์ด๋Ÿฐ ๊ฒฝ์šฐ @Provides๊ฐ€ ํ•„์š”ํ•จ.
  3. ์ƒ์„ฑ์ž ์ฃผ์ž…์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ

    • @Binds๋Š” ์ƒ์„ฑ์ž ์ฃผ์ž…(@Inject constructor)์ด ๊ฐ€๋Šฅํ•ด์•ผ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ.
    • ์ƒ์„ฑ์ž๊ฐ€ private์ด๊ฑฐ๋‚˜, object, sealed class ๋“ฑ์˜ ๊ฒฝ์šฐ @Binds๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— @Provides๊ฐ€ ํ•„์š”ํ•จ.

๐Ÿ“Œ ์ •๋ฆฌ: @Binds๋ฅผ ์šฐ์„  ์‚ฌ์šฉํ•˜๊ณ , ํ•„์š”ํ•  ๋•Œ๋งŒ @Provides ์‚ฌ์šฉ

โœ… ์ธํ„ฐํŽ˜์ด์Šค - ๊ตฌํ˜„์ฒด ์—ฐ๊ฒฐ์€ @Binds๋ฅผ ์‚ฌ์šฉ!
โœ… ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ๋ณต์žกํ•œ ๊ฐ์ฒด ์ƒ์„ฑ์ด ํ•„์š”ํ•˜๋ฉด @Provides๋ฅผ ์‚ฌ์šฉ!

// โœ… ๊ถŒ์žฅ๋˜๋Š” ๋ฐฉ์‹: @Binds ์‚ฌ์šฉ
@Module
@InstallIn(SingletonComponent::class)
abstract class RepositoryModule {
    @Binds
    abstract fun bindRepository(impl: RepositoryImpl): Repository
}
// โœ… ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ๋ณต์žกํ•œ ๋กœ์ง์ด ํ•„์š”ํ•  ๊ฒฝ์šฐ @Provides ์‚ฌ์šฉ
@Module
@InstallIn(SingletonComponent::class)
object NetworkModule {
    @Provides
    fun provideRetrofit(): Retrofit {
        return Retrofit.Builder()
            .baseUrl("https://api.example.com")
            .build()
    }
}

๐Ÿ“ ๋” ์ž์„ธํ•œ ๋‚ด์šฉ์ด ๊ถ๊ธˆํ•˜๋‹ค๋ฉด ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”!
๐Ÿ”— ๊ณต์‹ ๋ฌธ์„œ


profile
๋А๋‚€ ์ ์„ ์ ์–ด๋‚˜๊ฐ€๋ฉฐ ์„ฑ์žฅํ•˜๋Š” ๋ธ”๋กœ๊ทธ

0๊ฐœ์˜ ๋Œ“๊ธ€