[Android] 의존성 DI 알아보기 - 2

Bluewave·2025년 2월 25일

안드로이드

목록 보기
4/14
post-thumbnail

💗 DI 라이브러리

객체 간의 의존성을 자동으로 관리하고 주입해주는 도구
new로 객체를 직접 생성하는 대신, DI 라이브러리가 알아서 의존성을 제공해줌
=> like "자동 배달 서비스"

수동 의존성 주입 단점

  • 볼륨이 큰 프로젝트 -> 불필요한 코드 생성 (관리가 어려움)
  • 종속성 생성 불가능한 경우, lazy init처럼 코드 만들고 수명 직접 관리해야 함

대표적인 DI 라이브러리

라이브러리특징
HiltAndroid 공식 지원, Dagger 기반, 가장 간편
Dagger구글이 만듦, 강력, 컴파일 타임 주입
KoinKotlin 친화적, 코드 간결, 런타임 주입

💗 Hilt 사용 정리

  • @Inject: 이것만 붙이면 자동으로 의존성 주입해줌
  • @HiltViewModel: ViewModel도 쉽게 DI 적용 가능
  • @AndroidEntryPoint: Activity, Fragment에도 주입 가능

📖 Hilt 설정 - gradle

libs.versions.toml 코드 추가

[versions]
hilt = "2.44" # Hilt 버전 추가

[libraries]
hilt-android = { group = "com.google.dagger", name = "hilt-android", version.ref = "hilt" }
hilt-compiler = { group = "com.google.dagger", name = "hilt-compiler", version.ref = "hilt" }

[plugins]
hilt = { id = "com.google.dagger.hilt.android", version.ref = "hilt" }  # Hilt 플러그인 등록

build.gradle (project)에 플러그인 추가

plugins {
    alias(libs.plugins.hilt) apply false  // Hilt 플러그인 추가
}

build.gradle (module)에 종속성 추가

plugins {
    alias(libs.plugins.hilt)  // Hilt 플러그인 활성화
    id("kotlin-kapt")  // Hilt 컴파일러를 사용하기 위해 추가
}

dependencies {
    implementation(libs.hilt.android)
    kapt(libs.hilt.compiler)  // Hilt 컴파일러 추가
}

📖 기본 설정

Application 클래스에 @HiltAndroidApp 추가

@HiltAndroidApp
class MyApplication : Application()

📖 의존성 주입 방법

💠 @Inject로 생성자 주입

class Engine @Inject constructor() {
    fun start() = "Engine Started!"
}

Hilt가 engine 객체를 자동으로 관리 및 주입

💠 @HiltViewModel로 ViewModel에 주입

@HiltViewModel
class CarViewModel @Inject constructor(private val engine: Engine) : ViewModel() {
    fun drive() = engine.start()
}

ViewModel에서 @Inject로 의존성 주입 가능
@HiltViewModel을 사용해야 Hilt에서 관리 가능

💠 @AndroidEntryPoint로 Activity, Fragment에 주입

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
    private val viewModel: CarViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        println(viewModel.drive())  // "Engine Started!"
    }
}

📖 모듈로 외부 클래스 주입하기

@Inject를 붙일 수 없는 클래스(like 인터페이스, 외부 라이브러리)에 주입하기 위해서는 Hilt Module 사용

💠 @Module + @InstallIn으로 Hilt 모듈 생성

@Module
@InstallIn(SingletonComponent::class)  // 앱 전체에서 사용 가능
object AppModule {

    @Provides
    fun provideEngine(): Engine {
        return Engine()
    }
}

@Provides를 사용해서 수동으로 객체 제공


💠 @Singleton으로 싱글톤 객체 만들기

@Module
@InstallIn(SingletonComponent::class)
object AppModule {

    @Provides
    @Singleton
    fun provideEngine(): Engine {
        return Engine()
    }
}

모든 곳에서 같은 Engine 인스턴스를 사용하기 위해서 사용!

profile
Developer's Logbook

0개의 댓글