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

[Android] Dagger2 - Activity์— Dependency ์ฃผ์ž…

interfacer_han 2024. 6. 25. 06:59

#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() private val airbag = Airbag() private

kenel.tistory.com

์œ„ ๊ฒŒ์‹œ๊ธ€์˜ ์™„์„ฑ๋œ ์•ฑ์„ ์ผ๋ถ€ ์ˆ˜์ •ํ•ด์„œ, 'Activity์— ์˜์กด์„ฑ์„ ์ฃผ์ž…'ํ•ด๋ณธ๋‹ค. ์ด ๋ง์˜ ์˜๋ฏธ๋Š” #3-1์— ๋‚˜์˜จ๋‹ค. 

 

#2 @Component ์ธํ„ฐํŽ˜์ด์Šค ์† getter์˜ ๋ถˆํŽธํ•จ

// package com.example.activitydependencyinjection

import dagger.Component

@Component
interface CarComponent {
    fun getCar(): Car
    
    // fun getMotorcycle(): Motorcycle
    
    // fun getBicycle(): Bicycle
    
    // ...
}

์ด์ „ ๊ธ€์˜ @Component๋Š” ์œ„์™€ ๊ฐ™์ด getCar()๋ผ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ํ•˜์ง€๋งŒ, ํ”„๋กœ์ ํŠธ๊ฐ€ ์ ์  ์ปค์ง€๋ฉด getMotorcycle(), getBicycle() ๋”ฐ์œ„์˜ getter ํ•จ์ˆ˜๋“ค์ด ๊ณ„์† ๋Š˜์–ด๋‚  ๊ฒƒ์ด๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด, ํ•„์š”ํ•œ Dependent๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด์„œ getter ํ•จ์ˆ˜ ๋ชฉ๋ก์„ ๋’ค์ ๊ฑฐ๋ฆฌ๋Š” ๋น„ํšจ์œจ์ ์ธ ์ƒํ™ฉ์ด ์ดˆ๋ž˜๋œ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ dagger๋Š” Activity์— ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ง€์›ํ•œ๋‹ค.

 

#3 Activity์— Dependency๋ฅผ ์ฃผ์ž…ํ•˜๊ธฐ

#3-1 @Component ์ธํ„ฐํŽ˜์ด์Šค ์ˆ˜์ •

// package com.example.activitydependencyinjection

import dagger.Component

@Component
interface CarComponent {
    fun inject(mainActivity: MainActivity)
}

๊ทธ๊ฒƒ์€ ๋ฐ”๋กœ ์œ„ ์ฝ”๋“œ์ฒ˜๋Ÿผ ์ปดํฌ๋„ŒํŠธ ํด๋ž˜์Šค๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. inject()๋Š” getter ํ•จ์ˆ˜๋“ค์„ ํ•˜๋‚˜์˜ ํ•จ์ˆ˜๋กœ ํ†ตํ•ฉํ•œ ํ•จ์ˆ˜๋‹ค. getCar()์˜ ๊ฒฝ์šฐ Car๋ฅผ ์ตœ์ข… Dependent๋กœ ์‚ผ์•„ ์˜์กด์„ฑ ์ฃผ์ž…์„ ์ˆ˜ํ–‰ํ–ˆ์—ˆ๋‹ค. inject() ๋˜ํ•œ MainActivity๋ฅผ ์ตœ์ข… Dependent๋กœ ์‚ผ์•„ ์˜์กด์„ฑ ์ฃผ์ž…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๋Š” ์˜๋ฏธ๋‹ค.

 

ํ•˜์ง€๋งŒ inject()๋Š” getCar()์™€ ๋‹ฌ๋ฆฌ ๋ฐ˜ํ™˜ํ˜•์ด ์—†๋‹ค. ์ด๋Š” inject()์˜ ๋ชฉ์ ๊ณผ ๊ด€๋ จ์ด ์žˆ๋‹ค. inject()๋Š” MainActivity๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋Š” ๋ชฉ์ ์ด ์•„๋‹ˆ๋ผ, ์ด๋ฏธ ์ƒ์„ฑ๋œ MainActivity์— ํ›„ํ–‰์ ์œผ๋กœ Dependency๋ฅผ ์ฃผ์ž…ํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋‹ค. ๋”ฐ๋ผ์„œ MainActivity์˜ Dependency๋“ค์€ MainActivity์˜ ์ƒ์„ฑ๊ณผ ๋™์‹œ์— ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š๊ณ , lateinit varํ˜•์œผ๋กœ ์„ ์–ธ๋˜์–ด์•ผ ํ•œ๋‹ค. #3-2์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ํ•ด๋‹น Dependency๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

Car์˜ Dependency๋“ค์ธ Airbag, Battery, Engine์— @Inject ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ์˜์กด์„ฑ ์ฃผ์ž…์„ (dagger ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์•Œ ์ˆ˜ ์žˆ๊ฒŒ) ๋ช…์‹œํ™”ํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ, MainActivity์˜ Dependency๋“ค์—๊ฒŒ๋„ ์˜์กด์„ฑ ์ฃผ์ž… ๋Œ€์ƒ์ž„์„ ๋ช…์‹œํ™”ํ•ด์•ผ ํ•œ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ๋ณด์ž.

 

#3-2 MainActivity.kt ์ˆ˜์ •

// package com.example.activitydependencyinjection

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import javax.inject.Inject

class MainActivity : AppCompatActivity() {

    @Inject
    lateinit var car: Car

    override fun onCreate(savedState: Bundle?) {
        ...
/*
        ...
*/
        DaggerCarComponent.create().inject()
        car.startCar()
    }
}

์ด๋ ‡๊ฒŒ lateinit varํ˜• ํ”„๋กœํผํ‹ฐ๋ฅผ ์„ ์–ธํ•˜๊ณ  @Inject ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์ธ๋‹ค. @Inject๊ฐ€ ์ƒ์„ฑ์ž์— ๋ถ™์€ ๊ฒฝ์šฐ์—๋Š” Constructor Injection(์ด ๋งํฌ์˜ #2-1 ์ฐธ์กฐ)์ด ์ˆ˜ํ–‰๋˜์—ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ, @Inject๊ฐ€ ํ•„๋“œ(์ฝ”ํ‹€๋ฆฐ์€ Field๊ฐ€ ์—†์œผ๋ฏ€๋กœ, ๊ทธ ๋Œ€์‹  ํ”„๋กœํผํ‹ฐ)์— ๋ถ™์€ ๊ฒฝ์šฐ์—๋Š” Field Injection(์ด ๋งํฌ์˜ #2-3 ์ฐธ์กฐ)์ด ์ˆ˜ํ–‰๋œ๋‹ค.

 

๊ฒฐ๊ณผ์ ์œผ๋กœ, Activity์—์„œ ์‚ฌ์šฉํ•  Dependent๋“ค์„ @Inject ์–ด๋…ธํ…Œ์ด์…˜๊ณผ ํ•จ๊ป˜ ์„ ์–ธ๋งŒ ํ•ด๋‘๋ฉด, inject() ๋ฉ”์†Œ๋“œ์— ์˜ํ•ด Dependency๊ฐ€ ์•Œ์•„์„œ ์ฃผ์ž…๋œ๋‹ค. getter๋ฅผ ์ผ์ผํžˆ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

 

#3-3 ์˜์กด์„ฑ ๊ทธ๋ž˜ํ”„

Activity์— ์˜์กด์„ฑ ์ฃผ์ž…์„ ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์˜์กด์„ฑ ๊ทธ๋ž˜ํ”„๋กœ ๋‚˜ํƒ€๋‚ด๋ฉด ์œ„์™€ ๊ฐ™๋‹ค. ๋ณธ ๊ฒŒ์‹œ๊ธ€์˜ MainActivity๊ฐ€ ์‹ค์ œ๋กœ Motorcycle์ด๋‚˜ Bicycle ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ, ์ดํ•ด๋ฅผ ๋•๊ธฐ ์œ„ํ•ด ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ํฌํ•จ์‹œํ‚จ ๊ทธ๋ž˜ํ”„๋‹ค.

 

#4 ์ž‘๋™ ํ™•์ธ (๋กœ๊ทธ ๋ฉ”์‹œ์ง€)

Crankshaft is ready
Cylinder is ready
Piston is ready
Engine is ready
Airbag is ready
Battery is ready
Car is ready

 

#5 ์š”์•ฝ

์•กํ‹ฐ๋น„ํ‹ฐ๋„ Dependent๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.

 

#6 ์™„์„ฑ๋œ ์•ฑ

 

android-practice/dagger2/ActivityDependencyInjection at master · Kanmanemone/android-practice

Contribute to Kanmanemone/android-practice development by creating an account on GitHub.

github.com