본문 바로가기
Android Application/기초 사용법

안드로이드 힐트(hilt) 의존성 주입 사용

by sdchjjj 2023. 3. 31.
728x90

안녕하세요.

이번 포스팅에서는 hilt를 사용한 dependency injection을 간단하게 구현해 보겠습니다.

 

언어: 코틀린

sdk vsersion

  - compile: 33

  - min: 21

  - target: 33

 

저는 아래의 포스팅에서 사용한 소스에 적용해 보겠습니다.

https://it-of-fortune.tistory.com/23

 

안드로이드 데이터바인딩(dataBinding) 사용

안녕하세요. 이번 포스팅에서는 저번 포스팅에서 사용했던 프래그먼트와 뷰모델을 이용해 데이터바인딩을 구현해 보도록 하겠습니다. 아래 링크에서 이전에 구현한 내용을 참고해 주세요. 새

it-of-fortune.tistory.com

 

가장 먼저 자바 버전을 확인해야 합니다. 아래 내용을 확인해 주세요.

build.gradle(:app)

android {
    ...
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    ...
}

 

project level의 build.gradle에 아래 코드를 추가합니다.

build.gradle(project)

plugins {
    ...
    id 'com.google.dagger.hilt.android' version '2.44' apply false
    ...
}

app level의 build.gradle에도 아래와 같이 추가해 줍니다.

build.gradle(:app)

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

dependencies {
    ...
    implementation 'com.google.dagger:hilt-android:2.44'
    kapt 'com.google.dagger:hilt-android-compiler:2.44'
    ...
}

 

그리고 Application을 상속받는 class를 하나 생성하여 @HiltAndroidApp annotation을 달아줍니다(figure1 참조).

figure1. create new class

저는 심플하게 App이라는 이름으로 생성했습니다.

App.kt

@HiltAndroidApp
class App : Application() {}

manifest에 application name을 HiltAndroidApp 이름으로 설정합니다.

AndroidManifest.xml

<application 
    ...
    android:name=".App"
    ...
</application>

 

프래그먼트에는 @AndroidEntryPoint라는 annotation을 달아줍니다.

PracticeFragment.kt

@AndroidEntryPoint
class PracticeFragment : Fragment() {
    ...
}

또한, PracticeFragment는 MainActivity 하위에 있기 때문에 MainActivity에도 같은 annotation을 달아주어야 합니다.

MainActivity.kt

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

 

뷰모델에는 @HiltViewModel annotation을 달아주고, @Inject constructor()를 추가합니다.

PracticeViewModel.kt

@HiltViewModel
class PracticeViewModel @Inject constructor(): ViewModel() {
    ...
}

 

프래그먼트에서 뷰모델을 주입받아 사용하도록 코드를 수정합니다.

PracticeFragment.kt

@AndroidEntryPoint
class PracticeFragment : Fragment() {

    private var _binding: FragmentPracticeBinding? = null
    private val binding get() = _binding!!

    private val viewModel: PracticeViewModel by viewModels()

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        _binding = FragmentPracticeBinding.inflate(layoutInflater, container, false)
        binding.viewModel = this@PracticeFragment.viewModel
        binding.lifecycleOwner = viewLifecycleOwner
        return binding.root
    }

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }
}

아래 코드를 통해 주입받게 됩니다.

private val viewModel: PracticeViewModel by viewModels()

 

뷰모델 외에 다른 클래스의 주입도 구현해 보겠습니다.

 

Calculator라는 클래스를 생성하고, 뷰모델에서 주입받아 사용하도록 하겠습니다.

Calculator.kt

class Calculator @Inject constructor() {
    fun addNumberTwo(number: Int): Int{
        return number + 2
    }
}

 

PracticeViewModel.kt

@HiltViewModel
class PracticeViewModel @Inject constructor(
    private val calculator: Calculator
): ViewModel() {

    private val _testNumber = MutableLiveData(0)
    val testNumber: LiveData<Int> get() = _testNumber

    fun onButtonClicked() {
        setTestText(
            calculator.addNumberTwo(testNumber.value!!)
        )
    }

    private fun setTestText(number: Int) {
        _testNumber.value = number
    }
}

 

버튼을 클릭하면 숫자를 2씩 더해 화면에 표시해 주는 동작입니다.

에뮬레이터에서 코드 실행해 보겠습니다.

figure2. run

클래스를 생성하는 코드 없이 해당 클래스의 함수를 호출하여 사용이 가능합니다.

 

문제없이 의도한 대로 동작합니다.

 

이상 포스팅을 마치겠습니다.

 

감사합니다.

728x90

댓글