💉 의존성 주입이란?
- "의존성"은 서비스로 사용할 수 있는 객체이다. 클라이언트가 어떤 서비스를 사용할 것인지 지정하는 대신, 클라이언트에게 무슨 서비스를 사용할 것인지를 말해주는 것이다. "주입"은 의존성(서비스)을 사용하려는 객체(클라이언트)로 전달하는 것을 의미한다.
위키백과
의존성 주입은 다른 객체를 사용하기 위해서 객체를 따로 생성하는 것이 아니라, 객체를 주입을 받아서 사용하는 것이라고 생각한다.
나는 프렌차이즈의 예시로 생각했다.
나는 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) //외부에서 새로운 레시피를 넣어줌
}
🤔 근데 안드로이드 개발에서 굳이 di 라이브러리를 써야할까?
Activity, Fragment, Service와 같은 안드로이드 클래스들은 안드로이드 프레임워크에 의해 인스턴스화를 하기떄문에 매개변수와 같은 방법을 통해서 의존성 주입을 할 수 없습니다.
[드로이드나이츠 2020] 옥수환 - 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 설정
@HiltAndroidApp
class App4 : Application()
참고 문헌
https://kotlinworld.com/63?category=924584
https://devlog-wjdrbs96.tistory.com/165
https://www.youtube.com/watch?v=gkUCs6YWzEY&t=1417s