#1 ์ด์ ๊ธ
์์กด์ฑ ์ฃผ์ (Dependency Injection)
#1 ์์กด์ฑ ์ฃผ์ (Dependency Injection)์ด๋?#1-1 Dependent์ Dependencyfun main() { val car = Car() car.startCar() } class Car { private val engine = Engine() private val airbag = Airbag() private val battery = Battery() fun startCar() { engine.startE
kenel.tistory.com
๋ณธ ๊ฒ์๊ธ์ ์ดํดํ๋ ค๋ฉด ๋จผ์ , ์์กด์ฑ ์ฃผ์ ์ ๋ํด ์ด ์ด์ ๊ฒ์๊ธ์ ์ฝ์ด์ผ ํ๋ค. ๋, ์ด์ ๊ฒ์๊ธ์ ์ฝ๋๋ฅผ ์๋๋ก์ด๋ ํ๋ก์ ํธ๋ก Migrationํด์ ๋ณธ ๊ฒ์๊ธ์ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
#2 dagger
GitHub - google/dagger: A fast dependency injector for Android and Java.
A fast dependency injector for Android and Java. Contribute to google/dagger development by creating an account on GitHub.
github.com
ํ๋ก์ ํธ์์ Dependent - Dependency ๊ด๊ณ๊ฐ ์ ์ ๋ง์์ง๋ฉด ์ธ์ ๊ฐ ํ๋ก๊ทธ๋๋จธ๊ฐ ๊ฐ๋นํ๊ธฐ ํ๋ ์์ค์ ์ด๋ฅผ ๊ฒ์ด๋ค.
์ด ๋ ํ์ํ Dependency์ ์์์ ์ฃผ์
, ์์กด์ฑ ์ฝ๋๋ค์ ์ง๊ดํ, ๋ชจ๋ํ, ์ ์ง๋ณด์์ฑ ์ฆ๋๋ฅผ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ฐ๋ก dagger๋ค. dagger1์์ 2๋ก ๋์ด๊ฐ ๋ ๋ง์ ๋ณํ๊ฐ ์์๊ธฐ์ ๋ณธ ๊ฒ์๊ธ์ ์ ๋ชฉ์ Dagger2๋ก ์ฌ์ฉํ ๋ฒ์ ์ ๋ช
์ํ๋ค. ์ด์ , dagger ์ฌ์ฉ์ ๊ธฐ์ด์ ๋ํด ์์ ํด๋ณด๊ฒ ๋ค.
#3 ์ด์ ๊ฒ์๊ธ ์๋๋ก์ด๋ ํ๋ก์ ํธ๋ก Migration
#3-1 ๊ฐ์
๋จผ์ , dagger๋ฅผ ์ ์ฉํ ์ฝ๋๊ฐ ํ์ํ๋ค. ์ด์ ๊ฒ์๊ธ #2-1 ๋ถ๋ถ์ ์ฝ๋๋ฅผ ์๋๋ก์ด๋ ํ๋ก์ ํธ๋ก ์ฎ๊ฒผ๋ค. ๊ทธ ๊ณผ์ ์์ ๊ฐ ํด๋์ค๋ฅผ ํ๋ํ๋ ํ์ผ๋ก ๋ง๋ค์๊ณ ,
// package com.example.dagger2basics
import android.util.Log
class Car(
private val engineInstance: Engine,
private val airbagInstance: Airbag,
private val batteryInstance: Battery
) {
fun startCar() {
engineInstance.startEngine()
airbagInstance.startAirbag()
batteryInstance.startBattery()
Log.i("interfacer_han", "${this::class.simpleName} is ready")
}
}
์์ ๊ฐ์ด, println() ๋์ Log.i()๋ก ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ๊ฒ ์์ ํ๋ค.
#3-2 MainActivity.kt
// package com.example.dagger2basics
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val crankshaft = Crankshaft()
val cylinder = Cylinder()
val piston = Piston(crankshaft, cylinder)
val engine = Engine(pistonInstance)
val airbag = Airbag()
val battery = Battery()
val car = Car(engine, airbag, battery)
car.startCar()
}
}
MainActivity์๋, ์๋ ์ฝ๋์ main()์์ ์ ์ํ๋ ๋์์ ์ง์ด๋ฃ๋๋ค.
์ด์ , ์ด ํ๋ก์ ํธ๊ฐ dagger๋ฅผ ์ด์ฉํด Dependency(์์กด์ฑ)์ ์ฃผ์
(Inject)๋ฐ๋๋ก ์์ ํด๋ณธ๋ค.
#4 dagger ์ฌ์ฉํ๊ธฐ
#4-1 ํ๋ก์ ํธ ์์ค build.gradle ์์
plugins {
...
id("com.google.devtools.ksp") version "1.9.0-1.0.13" apply false
}
ksp ํ๋ฌ๊ทธ์ธ ์ถ๊ฐ
#4-2 ๋ชจ๋ ์์ค build.gradle ์์
plugins {
...
id("com.google.devtools.ksp")
id("org.jetbrains.kotlin.kapt")
}
android {
...
}
dependencies {
...
// Dagger2
val daggerVersion = "2.51.1"
implementation("com.google.dagger:dagger:$daggerVersion")
kapt("com.google.dagger:dagger-compiler:$daggerVersion")
}
ksp ๋ฐ kapt ํ๋ฌ๊ทธ์ธ ์ถ๊ฐ ๋ฐ Dagger2 ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ค์ด๋ก๋
#4-3 @Inject์ ์ดํด
dagger๋ ์ด๋
ธํ
์ด์
(@)์ ๊ธฐ๋ฐ์ผ๋ก ์๋ํ๋ค. ๊ทธ ์ค @Inject๋ dagger์ ๊ธฐ๋ณธ์ ์ด๊ณ ํต์ฌ์ ์ธ ์ญํ ์ ํ๋ ์ด๋
ธํ
์ด์
์ด๋ค. Inject(์ฃผ์
)์ ์ฌ์ ์ ์ ์ ๊ทธ๋๋ก, (์์ฑ์๋ฅผ) ์ฃผ์
ํ๋ค๋ ์๋ฏธ์ ์ด๋
ธํ
์ด์
์ด๋ค.
์ด์ ๊ฒ์๊ธ์ #2-1์ ์ํ๋ฉด, ์ด๋ค ํด๋์ค์ ์์ฑ์์ ์ ์๋ ๋ ๋ค๋ฅธ ํด๋์ค๋ Dependency๋ค. ๋ง์นจ, dagger ๋ํ '์์ฑ์ ์ฃผ์
' ๋ฐฉ์์ ๊ธฐ๋ฐํ์ฌ ์์ฑ์ ์ฃผ์
์ ์ํํ๋ค. ๋ฐ๋ผ์ dagger๋ ํ๋ก๊ทธ๋๋จธ๊ฐ ์์ฑ์์ ๋ถ์ธ @Inject๋ฅผ ๋ณด๊ณ Dependency์์ ํ๋จํ๋๋ก ์ค๊ณ๋์๋ค. ์๋ ์ฝ๋๋ฅผ ๋ณด์.
class Car @Inject constructor(
private val engine: Engine,
private val airbag: Airbag,
private val battery: Battery
) {
fun startCar() {
engine.startEngine()
airbag.startAirbag()
battery.startBattery()
Log.i("interfacer_han", "${this::class.simpleName} is ready")
}
}
Car์ ์์ฑ์์ @Inject๊ฐ ๋ถ์๋ค. ์ด์ , Engine, Airbag, Battery ํด๋์ค๋ Dagger ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ํด ์์์ ์ผ๋ก ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ ๋ช
๋จ์ ๋ฑ๋ก๋๋ค. ์ด ๋ง์, #3-2์ ์ฝ๋์์ engine, airbag, battery์ ๊ฐ์ฒด ์์ฑ ๋ฐ car = Car(engine, airbag, battery)๊ฐ ์์์ ์ผ๋ก ์ํ๋๋ค๋ ์๊ธฐ๋ค.
class Crankshaft @Inject constructor() { // ์ผํ ๋ณด๊ธฐ์, ์ด @Inject๋ ์๋ฌด๋ฐ ์๋ฏธ๊ฐ ์์ด๋ณด์ธ๋ค.
fun startCrankshaft() {
Log.i("interfacer_han", "${this::class.simpleName} is ready")
}
}
ํท๊ฐ๋ฆฌ์ง ๋ง์์ผ ํ๋ ๊ฒ์, @Inject๊ฐ ๋ถ๋ ๋์์ Class๊ฐ ์๋๋ผ ์์ฑ์๋ผ๋ ์ฌ์ค์ด๋ค. ์ ์ฝ๋์์ Crankshaft ํด๋์ค๋ Dependent์ด์ง, Denpendency๊ฐ ์๋๋ค. ํ์ง๋ง ๊ทธ๋ ๋ค๊ณ ์์ฑ์ ์ธ์๋ฅผ ์๊ตฌํ์ง ์๋ ํด๋์ค, ์ฆ ์์กด์ฑ ๊ทธ๋ํ(์ด์ ๊ฒ์๊ธ์ #1-3 ์ฐธ์กฐ)์์ ๋ง๋จ ๋ถ๋ถ์ ๋ด๋นํ๊ณ ์๋ ํด๋์ค์ @Inject๋ฅผ ๋ถ์ด์ง ์์์ผ ํ๋ ๊ฑด ์๋๋ค. ์๋ํ๋ฉด, ๋น์ด์๋ ์์ฑ์์ @Inject๋ฅผ ๋ถ์์ผ๋ก์ ํด๋น ํด๋์ค๋ Dendency๊ฐ ์๋ค๋ ๊ฑธ (dagger ์
์ฅ์์) ๋ช
์์ ์ผ๋ก ํ์
ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
#4-4 @Inject ๋ถ์ด๊ธฐ
์์กด์ฑ ๊ทธ๋ํ์ ๋์ ์๋ ๋ชจ๋ ํด๋์ค์ @Inject๋ฅผ ๋ถ์ธ๋ค. ์ด์ , dagger์ 'Denpendency ์์์ ์ ๋ฌ ๋ช
๋จ'์๋ Engine, Airbag, Battery, Piston, Crakshift, Cylinder์ 6๊ฐ ํด๋์ค๊ฐ ์ถ๊ฐ๋๋ค.
#4-5 @Component
// package com.example.dagger2basics
import dagger.Component
@Component
interface CarComponent {
fun getCar(): Car
}
@Component ์ด๋
ธํ
์ด์
์ด ๋ถ์ ์ธํฐํ์ด์ค๋ @Inject๊ฐ ๋ถ์ ์์ฑ์๋ @Provide๊ฐ ๋ถ์ ๋ฉ์๋๋ฅผ ์ค์บํ๊ณ , ์์กด์ฑ์ ์ฃผ์
ํ๋ ์ญํ ์ ์ํํ๋ค. @Component์ ์ถ์ ํจ์๋ฅผ ์ถ๊ฐํ๊ณ ์ปดํ์ผ์ ํ๋ฉด, dagger์ ์ํด Dagger + ์ธํฐํ์ด์ค ์ด๋ฆ์ผ๋ก ๋ช
๋ช
๋ ํด๋์ค๊ฐ ์์ฑ๋๋ค (์ฌ๊ธฐ์ DaggerCarCompenent). ๊ทธ๋ฆฌ๊ณ ์ธํฐํ์ด์ค์ ์ ์ํ๋ ์ถ์ ํจ์๋ค๋ ๊ตฌํ๋๋๋ฐ, ์ถ์ ํจ์๋ค์ด ์ง๋
๋ ๋ฐํ ํ์
(์ฌ๊ธฐ์๋ Car)์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ธฐ ์ํ ์์กด์ฑ ์ฃผ์
์ฝ๋๊ฐ ๊ตฌํ ํจ์์ ๋ค์ด๊ฐ๋ค.
#4-6 ์์กด์ฑ ๊ทธ๋ํ
@Component ํด๋์ค๋ ์์ ๊ฐ์ ์์กด์ฑ ๊ทธ๋ํ๋ฅผ ํ ๋๋ก ์์กด์ฑ ์ฃผ์
์ ์๋์ผ๋ก ์ํํ ๊ฒ์ด๋ค. @Inject ๋๋ @Provide๋ก ์์์ ๋งํ๋ ๋ช
๋จ์ ๊ตฌ์ฑํด๋๋ฉด dagger๋, ๋ ์ ํํ๋ @Component ํด๋์ค๋ ์์ ๊ฐ์ ์์กด์ฑ ๊ทธ๋ํ๋ฅผ ์์์ ๊ทธ๋ ค๋ธ๋ค.
#4-7 ์ปดํ์ผ ํ๊ธฐ
MainActivity๋ฅผ ์์ ํ๊ธฐ ์ ๋จผ์ @Component ํด๋์ค๋ฅผ ๋ง๋ค๊ธฐ ์ํ ์ปดํ์ผ์ ์งํํ๋ค. [Build] - [Clean Project] ํ [ Build ] - [Rebuild Project]๋ฅผ ์ฐจ๋ก๋๋ก ํด๋ฆญํ๋ค.
#4-8 MainActivity์์ ์๋์ ์์กด์ฑ ์ฃผ์ ์ฝ๋ ์ ๊ฑฐ
...
class MainActivity : AppCompatActivity() {
override fun onCreate(savedState: Bundle?) {
super.onCreate(savedState)
setContentView(R.layout.activity_main)
/*
val crankshaft = Crankshaft()
val cylinder = Cylinder()
val piston = Piston(crankshaft, cylinder)
val engine = Engine(piston)
val airbag = Airbag()
val battery = Battery()
val car = Car(engine, airbag, battery)
*/
val car = DaggerCarComponent.create().getCar()
car.startCar()
}
}
๊ธฐ์กด์ ์ผ๋ ์๋์ผ๋ก ์์กด์ฑ์ ์ฃผ์
ํ๋ ์ฝ๋๋ฅผ ์ ๊ฑฐํ๋ค. Component ํด๋์ค๋ฅผ ์์ฑํ๊ณ #4-5์์ ๋ง๋ค์ด๋์๋ ์ถ์ ํจ์์ ๊ตฌํ ํจ์์ธ getCar()๋ฅผ ํธ์ถํ๋ฉด, Compoenent ํด๋์ค๊ฐ ๊ทธ๋ ค๋ธ ์์กด์ฑ ๊ทธ๋ํ์ ๊ธฐ๋ฐํ์ฌ ์์กด์ฑ์ด ์ฐ์์ ์ผ๋ก ์ฃผ์
๋๊ณ ์ต์ข
์ ์ผ๋ก Car ๊ฐ์ฒด๊ฐ ๋ง๋ค์ด์ง๋ค.
#5 ์๋ ํ์ธ (๋ก๊ทธ ๋ฉ์์ง)
Crankshaft is ready
Cylinder is ready
Piston is ready
Engine is ready
Airbag is ready
Battery is ready
Car is ready
#6 ์์ฝ
์์ฑ์์ Dependency๋ฅผ ๋ช
์ํ๋ ์๊ฐ๋ถํฐ, Dagger์ ๊ฐ์ด ํธ๋ฆฌํ ์๋ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ธ์ ๊ฐ ๋์ฌ ์ด๋ช
์ด์๋ค.
#7 ์์ฑ๋ ์ฑ
android-practice/dagger2/Dagger2Basics at master · Kanmanemone/android-practice
Contribute to Kanmanemone/android-practice development by creating an account on GitHub.
github.com
#8 ์ด์ด์ง๋ ๊ธ
#8-1 @Provides ์ฌ์ฉํ๊ธฐ
[Android] Dagger2 - @Provides
#1 ์ด์ ๊ธ [Android] Dagger2 - ๊ธฐ์ด#1 ์ด์ ๊ธ ์์กด์ฑ ์ฃผ์ (Dependency Injection)#1 ์์กด์ฑ ์ฃผ์ (Dependency Injection)์ด๋?#1-1 Dependent์ Dependencyfun main() { val car = Car() car.startCar() } class Car { private val engine = Engine
kenel.tistory.com
ํด๋์ค์ ์์ฑ์์ @Inject๋ฅผ ๋ถ์ผ ์ ์๋ ๊ฒฝ์ฐ์ ์์กด์ฑ ์ฃผ์ ์ ๊ตฌํํด๋ณธ๋ค.
#8-2 ์ธํฐํ์ด์ค ๊ตฌํ์ฒด๋ฅผ ์์กด์ฑ ์ฃผ์ ํ๊ธฐ
[Android] Dagger2 - ์ธํฐํ์ด์ค ๊ตฌํ์ฒด ์ฃผ์ (@Binds)
#1 ์ด์ ๊ธ [Android] Dagger2 - ๊ธฐ์ด#1 ์ด์ ๊ธ ์์กด์ฑ ์ฃผ์ (Dependency Injection)#1 ์์กด์ฑ ์ฃผ์ (Dependency Injection)์ด๋?#1-1 Dependent์ Dependencyfun main() { val car = Car() car.startCar() } class Car { private val engine = Engine
kenel.tistory.com
Interface๋ฅผ Dependency๋ก ์ฃผ์ ํด๋ณธ๋ค.
#8-3 Activity์ ์์กด์ฑ ์ฃผ์ ํ๊ธฐ
[Android] Dagger2 - Activity์ Dependency ์ฃผ์
#1 ์ด์ ๊ธ [Android] Dagger2 - ๊ธฐ์ด#1 ์ด์ ๊ธ ์์กด์ฑ ์ฃผ์ (Dependency Injection)#1 ์์กด์ฑ ์ฃผ์ (Dependency Injection)์ด๋?#1-1 Dependent์ Dependencyfun main() { val car = Car() car.startCar() } class Car { private val engine = Engine
kenel.tistory.com
Activity์ Field Injection์ ์ํํด๋ณธ๋ค.
#8-4 Component ์ธ์คํด์ค ์ฑ๊ธํค์ผ๋ก ๊ด๋ฆฌํ๊ธฐ
[Android] Dagger2 - Application ํ์ฉํ๊ธฐ
#1 ์ด์ ๊ธ [Android] Dagger2 - ๊ธฐ์ด#1 ์ด์ ๊ธ ์์กด์ฑ ์ฃผ์ (Dependency Injection)#1 ์์กด์ฑ ์ฃผ์ (Dependency Injection)์ด๋?#1-1 Dependent์ Dependencyfun main() { val car = Car() car.startCar() } class Car { private val engine = Engine
kenel.tistory.com
Application ํด๋์ค๋ฅผ ํตํด Component ์ธ์คํด์ค๋ฅผ ์ฑ๊ธํค์ผ๋ก ๊ด๋ฆฌํ๋ค.
'๊นจ์ ๊ฐ๋ ๐ > Android' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Android] Dagger2 - ๋งค๊ฐ๋ณ์ ๋์ ํ ๋น (0) | 2024.06.24 |
---|---|
[Android] Dagger2 - @Provides (0) | 2024.06.24 |
[Android] WorkManager - ๋ณ๋ ฌ Chaining (0) | 2024.06.17 |
[Android] WorkManager - ์์ ์ฐ์ํ๊ธฐ(Chaining) (0) | 2024.06.17 |
[Android] WorkManager - ์ ์ฝ ์กฐ๊ฑด (Constraints) (0) | 2024.06.17 |