Hilt 주사기로 의존성 주입하기 (1)

정진호·2022년 1월 28일
0

hilt

목록 보기
1/1

💉 의존성 주입이란?

  • "의존성"은 서비스로 사용할 수 있는 객체이다. 클라이언트가 어떤 서비스를 사용할 것인지 지정하는 대신, 클라이언트에게 무슨 서비스를 사용할 것인지를 말해주는 것이다. "주입"은 의존성(서비스)을 사용하려는 객체(클라이언트)로 전달하는 것을 의미한다. 위키백과

정리한 내 생각은

의존성 주입은 다른 객체를 사용하기 위해서 객체를 따로 생성하는 것이 아니라, 객체를 주입을 받아서 사용하는 것이라고 생각한다.

🧐의존성 주입이 왜 필요할까?

나는 프렌차이즈의 예시로 생각했다.
나는 BBQ의 가맹점이며, 레시피1을 매일 직접 생성하여 치킨을 만든다고 가정하자.
어느날 본사에서 레시피1은 맛이 없다는 소문을 듣고 레시피2로 바꾸라고 지침이 내려왔다.
객체를 직접 생성한 나는 꼼짝없이 생성한 모든 레시피1을 다 레시피2로 바꿔야한다.

위의 예시는 나와 레시피간의 결합도가 높아서 생기는 문제이다.

해당 문제는 레시피(객체)를 생성하는 것이 아닌 직접 본사에서 레시피를 직접 넣어주는 방식으로 해결할 수 있다. 코드를 이용한 예시를 알아보자.

//1. 내부에서 직접 레시피를 생성하여 사용했다.
class JainosBBQ {
    private val recipe = Recpie()
    fun cook() {
        recipe.cook()
    }
}
fun main(args: Array) {
    val me = JainosBBQ()
    me.cook()
}
//2. 본사의 지침: 레시피 -> 레시피2로 변경하세요
class Recipe2: Recipe(){ }

class JainosBBQ {
    private val recipe = Recipe2() //레시피 변경시점 
    fun cook() {
        recipe.cook()
    }
}
fun main(args: Array) {
    val me = JainosBBQ()
    me.cook()
}
  • 본사의 지침이 내려온 후 내부 코드에서 수정을 해야 한다. 이렇게 되면 새로운 레시피가 나올 떄마다 내부에서 코드를 바꿔줘야한다. 이는 비효율적이며, 코드를 재사용하기도 힘들다.
//의존성 주입을 이용하게 되면 내부에서 레시피를 생성하거나,
//수정하지 않고 생성자에 변경된 레시피를 받아서 쓸 수 있게 되었다.

class Recipe2: Recipe(){ }

class JainosBBQ(
    private val recipe: Recipe
){
    fun cook() {
        recipe.cook()
    }
}
fun main(args: Array) {
    val recipe2 = Recipe2()
    val recipe = Recipe()
    val new = JainosBBQ(recipe2) //외부에서 새로운 레시피를 넣어줌 
}

👍 정리: 의존성 주입의 장점

  1. 객체간의 결합도가 낮아져 특정 클래스를 테스트하기 용이해진다.
  2. 코드가 단순화되고 가독성이 좋아진다.
  3. 객체간의 결합도는 낮아지면서 코드간의 재사용성, 확장성이 증가한다.

🤔 근데 안드로이드 개발에서 굳이 di 라이브러리를 써야할까?

Activity, Fragment, Service와 같은 안드로이드 클래스들은 안드로이드 프레임워크에 의해 인스턴스화를 하기떄문에 매개변수와 같은 방법을 통해서 의존성 주입을 할 수 없습니다.
[드로이드나이츠 2020] 옥수환 - Hilt와 함께 하는 안드로이드 의존성 주입


😊자 이제 Hilt에 대해서 알아보자! 우리 hilt는요,,

  • 의존성 주입을 위한 라이브러리
  • hilt는 기존 Dagger의 단점인 높은 러닝커브를 개선한 쉽고 편리한 라이브러리
  • 표준화된 스코프와 컴포넌트 세트로 가독성을 좋은 라이브러리
  • AndroidX 라이브러리(ViewModel, WorkManager)와 호환되는 라이브러리

hilt를 사용하기 앞서서,

plugin{
id 'dagger.hilt.android.plugin'
}
//플러그인 설치 

dependencies {
//Dagger - Hilt
    implementation "com.google.dagger:hilt-android:2.38.1"
    kapt "com.google.dagger:hilt-android-compiler:2.37"
    implementation "androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha03"
    kapt "androidx.hilt:hilt-compiler:1.0.0"
    }  // lib 가져오기 

    
dependencies {
  classpath "com.google.dagger:hilt-android-gradle-plugin:2.38.1"
  } //path 설정 

그다음 Application class를 생성하여 @HiltAndroidApp 어노테이션 달아주기!

@HiltAndroidApp
class App4 : Application()
  • Hilt Application class는 모든 의존성 주입의 시작점이다.

참고 문헌
https://kotlinworld.com/63?category=924584
https://devlog-wjdrbs96.tistory.com/165
https://www.youtube.com/watch?v=gkUCs6YWzEY&t=1417s

profile
컴붕이

0개의 댓글