๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“ฑ| Android/๐Ÿ“˜ | ๊ธฐ๋ก

[Android] dagger hilt ๊ธฐ๋ก

by immgga 2022. 3. 29.

์นœ๊ตฌ๋“ค๊ณผ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋ฉด์„œ dagger hilt์— ๋Œ€ํ•œ ํ•„์š”์„ฑ์„ ๋Š๋ผ๊ณ  ์ด ํฌ์ŠคํŒ…์„ ์ž‘์„ฑํ•œ๋‹ค

 

dagger hilt๋ž€?

dagger hilt๋Š” ์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ ํด๋ž˜์Šค๊ฐ„ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ• ์ˆ˜ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.

dagger hilt๋ฅผ ์•Œ์•„๋ณด๊ธฐ ์ „์— ์ผ๋‹จ ์˜์กด์„ฑ์ด ๋ฌด์—‡์ธ์ง€ ๋ถ€ํ„ฐ ์•Œ์•„๋ณด์ž.

 

์˜์กด์„ฑ์ด๋ž€?

์˜์กด์„ฑ์ด๋ž€ ํด๋ž˜์Šค๊ฐ„ ์˜์กด ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง€๋Š” ํ˜„์ƒ์„ ๋œปํ•œ๋‹ค.

 

์˜ˆ์‹œ

class B {
    val id = "dltntlro"
}

class A {
    val data = B()
}

Aํด๋ž˜์Šค ๋‚ด๋ถ€์— Bํด๋ž˜์Šค ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜์–ด ์žˆ์Œ(์˜์กด์ ์ž„)์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค

์ด๋Ÿฌํ•œ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•˜๋ฉด Aํด๋ž˜์Šค๊ฐ€ ํ˜ธ์ถœ๋ ๋•Œ๋งˆ๋‹ค Bํด๋ž˜์Šค๋„ ๊ณ„์† ์ƒ์„ฑ๋˜๊ธฐ ๋–„๋ฌธ์— ๋น„ํšจ์œจ์ ์ด๊ฒŒ ๋œ๋‹ค.

 

์ฃผ์ž…์ด๋ž€?

์ฃผ์ž…์ด๋ž€ ํด๋ž˜์Šค ์™ธ๋ถ€์—์„œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

 

์˜ˆ์‹œ 2

class B {
    val id = "dltntlro"
}

class A(bClass: B) {
    val data = bClass
}

์˜ˆ์‹œ 2์—์„œ๋Š” Aํด๋ž˜์Šค ๋‚ด๋ถ€๊ฐ€ ์•„๋‹ˆ๋ผ Aํด๋ž˜์Šค์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ Bํด๋ž˜์Šค๋ฅผ ์ฃผ์ž…ํ–ˆ๋‹ค.

 

์˜์กด์„ฑ ์ฃผ์ž…์ด๋ž€ ํด๋ž˜์Šค ์™ธ๋ถ€์—์„œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด ์ฃผ์ž…ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

์˜์กด์„ฑ ์ฃผ์ž…์˜ ์žฅ์ 

  • ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ์ด ๋†’๋‹ค
  • ์ฝ”๋“œ ๋ณ€๊ฒฝ์ด ์ž์œ ๋กญ๋‹ค

 

dagger hilt

Google์—์„œ ๋ฐœํ‘œํ•œ ์•ˆ๋“œ๋กœ์ด๋“œ ์ „์šฉ ์˜์กด์„ฑ ์ฃผ์ž… ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฅผ ๋œปํ•œ๋‹ค.

 

hlit๋Š” dagger2๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ด dagger2๋ณด๋‹ค ๋Ÿฌ๋‹์ปค๋ธŒ๊ฐ€ ๋‚ฎ๊ณ , ์˜์กด์„ฑ ์ฃผ์ž… ๊ตฌ์ถ• ์‹œ๊ฐ„์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

 

์ด์ œ๋ถ€ํ„ฐ dagger hilt๋ฅผ ์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ ์“ฐ๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด๊ฒ ๋‹ค.

 

add Dependency(2022.3.29 ๊ธฐ์ค€)

 

project/build.gradle

buildscript {
    ...
    dependencies {
        ...
        classpath 'com.google.dagger:hilt-android-gradle-plugin:2.38.1'
    }
}

 

app/build.gradle

plugins {
  id 'kotlin-kapt'
  id 'dagger.hilt.android.plugin'
}

android {
    ...
}

dependencies {
    implementation "com.google.dagger:hilt-android:2.38.1"
    kapt "com.google.dagger:hilt-compiler:2.38.1"
}

 

hilt ์‚ฌ์šฉํ•˜๊ธฐ

 

@HiltAndroidApp

hilt๋ฅผ ์‚ฌ์šฉํ•˜๋Š” android app์— ํ•„์ˆ˜์ ์œผ๋กœ ์žˆ์–ด์•ผ ํ•  ์–ด๋…ธํ…Œ์ด์…˜์ด๊ณ ,

์˜์กด์„ฑ ์ฃผ์ž…์˜ ์‹œ์ž‘์ ์„ ์ง€์ •ํ•œ๋‹ค

 

@AndroidEntryPoint
class App : AppCompatActivity() { ... }

 

@HiltAndroidApp์ด ๋“ค์–ด๊ฐ„ ํด๋ž˜์Šค๋Š” menifast์— name์„ ์ถ”๊ฐ€ํ•ด ์ค˜์•ผ ํ•œ๋‹ค

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package=" ... ">
    <application
    	...
        android:name=".App">
        
        <activity
        	...

 

 

@AndroidEntryPoint

@AndroidEntryPoint์„ ์ถ”๊ฐ€ํ•ด์„œ ์ž๋™์œผ๋กœ ์ƒ๋ช…์ฃผ๊ธฐ์— ๋”ฐ๋ผ ์ ์ ˆํ•˜๊ฒŒ hilt์š”์†Œ๋กœ ์ธ์Šคํ„ด์Šคํ™” ๋˜์–ด ์ฒ˜๋ฆฌ๋œ๋‹ค.

@AndroidEntryPoint
class HiltActivity : AppCompatActivity() { ... }

hlit๊ฐ€ ์ง€์›ํ•˜๋Š” ์•ˆ๋“œ๋กœ์ด๋“œ ํด๋ž˜์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

- Activity

- Fragment

- View

- Service

- BroadcastReceiver

 

@Inject

@Inject์œผ๋กœ ์˜์กด์„ฑ์„ ์ฃผ์ž…๋ฐ›์œผ๋ ค๋Š” ๋ณ€์ˆ˜์— ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค.

class MainActivity : AppCompatActivity() {
    @Inject lateinit var viewModel: MainViewModel
}

 

@Inject๋ง๊ณ ๋„ ์˜์กด์„ฑ์„ ์ƒ์„ฑํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

- @Inject ์— ์ƒ์„ฑ์ž(constructor)

- Hilt ๋ชจ๋“ˆ๋“ค (@Module, @Provides, @Binds)

 

@Inject constructor

ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž์—์„œ @Inject๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜์กด์„ฑ์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

class MainAdapter @Inject constructor(
  private val service: MainService
) { ... }

์ƒ์„ฑ์ž์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์˜์กด์„ฑ์„ ์ฃผ์ž…๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

 

Hilt ๋ชจ๋“ˆ

์ƒ์„ฑ์ž์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์˜์กด์„ฑ ์ฃผ์ž…์„ ํ•˜๊ธฐ๊ฐ€ ํž˜๋“  ๊ฒฝ์šฐ ์‚ฌ์šฉํ•œ๋‹ค.(์˜ˆ: retrofit2, okhttp, room database ๋“ฑ)

์ด๋Ÿฌํ•œ ๋ชจ๋“ˆ๋“ค์€ hilt์—๊ฒŒ ์˜์กด์„ฑ ์ธ์Šคํ„ด์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค์ค€๋‹ค.

 

@InstallIn

@InstallIn(component)ํ˜•์‹์œผ๋กœ ์‚ฌ์šฉํ•ด ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ์— installํ• ์ง€ ์ •ํ•ด์•ผ ํ•œ๋‹ค.

@InstallIn(ActivityComponent::class)
object MainModule { ... }

 

hlit์—์„œ ์ œ๊ณตํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค

hlit์—์„œ ์ œ๊ณตํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ

๊ฐ ์ปดํฌ๋„ŒํŠธ๋“ค์€ ์ƒ์„ฑ์‹œ์ ๋ถ€ํ„ฐ ํŒŒ๊ดด๋  ๋•Œ๊นŒ์ง€ ์ฃผ์ž…์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

@Provides

๊ฐœ๋ฐœ์ž๊ฐ€ ์ƒ์„ฑ์ž๋ฅผ ์‚ฝ์ž…ํ•  ์ˆ˜ ์—†์„๋•Œ ์‚ฌ์šฉ๋˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜

object MainModule {

  @Provides
  fun provideMainService(): AnalyticsService {
      return Retrofit.Builder()
               .baseUrl("https://example.com")
               .build()
               .create(MainService::class.java)
  }
}

 

viewModel์— ์˜์กด์„ฑ ์ƒ์„ฑ ๋ฐฉ๋ฒ•

@HiltViewModel๊ณผ @Inject๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

@HiltViewModel
class MainViewModel @Inject constructor(
    private val repository: MainRepository
    ) : ViewModel() { ... }

 

์—ฌ๊ธฐ๊นŒ์ง€ ์˜์กด์„ฑ ์ฃผ์ž…์— ๋Œ€ํ•ด ๋‚ด๊ฐ€ ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•ด ๋ณด์•˜๋‹ค.

๋‹ค๋ฅธ ๋ธ”๋กœ๊ทธ์— ๋” ๋งŽ์€ ์ •๋ณด๋“ค์ด ์žˆ์„ ๊ฑฐ๋‹ˆ ์ฐธ๊ณ  ๋ฐ”๋ž€๋‹ค.

๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ๋‚ด์šฉ๋“ค์€ ์‚ฌ์‹ค๊ณผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์œผ๋‹ˆ ์–‘ํ•ด ๋ฐ”๋ž€๋‹ค.

ํ˜น์‹œ ์ง€์ ํ•  ๋‚ด์šฉ์ด ์žˆ์œผ๋ฉด ๋Œ“๊ธ€๋กœ ๋‚จ๊ฒจ์ฃผ์„ธ์š”

728x90

๋Œ“๊ธ€