๊นจ์•Œ ๊ฐœ๋… ๐Ÿ“‘/Android

[Android] Dagger2 - ๊ธฐ์ดˆ

interfacer_han 2024. 6. 24. 05:49

#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 ์ธ์Šคํ„ด์Šค๋ฅผ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค.