MVVM은 안드로이드에서 많이 사용되는 아키텍처이지만, 화면이 복잡해질수록 상태가 여러 LiveData나 StateFlow로 나뉘어 관리되는 경우가 많습니다. 이렇게 되면 현재 화면 상태를 한눈에 파악하기 어렵고, 상태 변경 흐름을 추적하거나 디버깅하는 것도 복잡해질 수 있습니다.또한 DataBinding이나 양방향 바인딩을 함께 사용할 경우, View와 ViewModel 사이의 상태 변경 흐름이 분산되어 유지보수가 어려워질 수 있습니다.예를 들어 로그인 화면에서 ViewModel이 여러 LiveData로 상태를 나눠서 View와 상호작용하는 경우는 아래처럼 볼 수 있습니다.class LoginViewModel : ViewModel() { private val _email = MutableLiveD..
멀티 모듈 프로젝트에서는 보통 app 모듈이 Application을 가지고 있고, core나 base 모듈에 공통 코드가 들어갑니다. app 모듈은 앱 전역에서 공유되는 객체를 제공하는 컴포넌트를 두기에 적절합니다.구조 잡는 기준멀티 모듈에서 같은 레벨의 모듈끼리는 서로 의존하지 않는 것이 일반적인 규칙입니다. 같은 레벨에서 의존이 생기면 공통 로직을 상위 모듈로 올리거나, 상위 모듈을 확장하는 새 모듈을 만들고 두 모듈이 그 모듈에 의존하도록 리팩터링하는 방식을 권장합니다.컴포넌트를 모듈에 만드는 경우는 보통 두 가지입니다. 필드 주입이 필요하거나, 특정 흐름에서 객체를 스코프 처리해야 할 때입니다. 둘 다 아니라면 컴포넌트 대신 @Provides나 @Binds를 가진 Dagger 모듈을 노출하는 방식..
Android에서 Dagger를 적용할 때는 Application 수명주기에 맞는 그래프를 만들고, Activity와 Fragment에는 필드 주입으로 연결하는 방식이 기본입니다. 그래프는 Dagger가 관리하는 객체 관계라고 보면 됩니다.가능하면 생성자 주입을 사용생성자 주입이 어려운 타입은 모듈로 제공모듈은 컴포넌트에서 한 번만 선언하는 구조로 작성스코프는 기능 이름보다 수명주기 기준으로 작성 Android의 DaggerApplication에 그래프 두기Application에 컴포넌트를 만들어 두면 앱 실행 동안 그래프를 공유할 수 있습니다. 앱 전역에서 재사용할 객체는 이 그래프에 두는 것이 자연스럽습니다.// Application 그래프 정의@Componentinterface Application..
Dagger는 Java 및 Kotlin 애플리케이션에서 사용하는 정적 의존성 주입(Dependency Injection) 프레임워크입니다.Android 환경에서 객체 생성 및 종속성 관리를 자동화하여, 유지보수성과 테스트 용이성을 향상시킵니다.컴파일 타임 코드 생성으로 리플렉션 기반 DI보다 성능 우수의존성 그래프 자동 생성 및 검증Factory 클래스 생성을 통한 객체 생성 관리스코프 어노테이션을 활용한 객체 생명주기 관리서브컴포넌트(Subcomponent) 지원으로 특정 흐름 단위 DI 가능주요 구성 요소@Inject: 생성자 또는 필드에 붙여 의존성을 주입@Module: Dagger에 바인딩을 제공하는 클래스 정의@Provides: 생성자 주입이 불가능한 타입을 수동으로 제공@Component: 의..
1. @HiltAndroidAppApplication 클래스에 붙임Hilt의 시작점 (DI 그래프 생성됨)@HiltAndroidApp class MyApp : Application() 2. @AndroidEntryPointActivity, Fragment, Service 등 Android 컴포넌트에 붙임Hilt 주입 가능하게 만듦@AndroidEntryPoint class MainActivity : AppCompatActivity() 3. @Inject생성자나 필드에 붙여서 주입 받을 수 있게 함class AnalyticsAdapter @Inject constructor( private val service: AnalyticsService) { ... }@AndroidEntryPointclass MyA..
Hilt와 같은 종속 항목 삽입 프레임워크를 사용하여 얻을 수 있는 이점 중 하나는 코드를 더 쉽게 테스트할 수 있다는 점입니다. 테스트 Application 클래스 구성@HiltAndroidApp이 선언된 실제 앱의 Application 클래스는 테스트에서 무시되고, HiltTestApplication이 대신 사용됩니다.보통 Hilt 테스트용 Application 클래스는 Hilt가 기본으로 제공하는 HiltTestApplication을 Application 클래스로 사용합니다.혹은 AndroidJUnitRunner를 확장하는 맞춤 클래스를 생성합니다.// 테스트 전용 manifest를 따로 둘 경우 아래처럼 설정 가능:android { defaultConfig { testInstr..
안드로이드 앱 개발에서 ViewModel, Navigation, Compose, WorkManager와 같은 Jetpack 컴포넌트는 거의 필수적으로 사용되는 라이브러리입니다. Hilt는 이러한 Jetpack 컴포넌트들과 자연스럽게 통합되도록 설계되어 있으며, 의존성 주입을 보다 일관적이고 효율적으로 구성할 수 있도록 지원합니다. ViewModel에 의존성 주입하기Hilt는 ViewModel에 의존성을 주입하기 위한 전용 어노테이션인 @HiltViewModel을 제공합니다. 이를 통해 ViewModel도 다른 클래스들과 마찬가지로 Hilt의 DI 그래프에 포함시킬 수 있습니다.@HiltViewModelclass ExampleViewModel @Inject constructor( private va..
모듈화를 통해 기능별로 코드를 분리하면 코드의 응집도와 재사용성이 높아지고, 테스트 및 배포가 용이해지는 장점이 있습니다.일반적으로 Hilt가 코드를 생성하려면, Hilt를 사용하는 모든 Gradle 모듈에 접근할 수 있어야 합니다.앱 모듈은 다른 모듈에서 정의된 모든 Hilt 모듈(@Module) 및 생성자 주입 클래스(@Inject) 들이 전이 종속성(Transitive Dependency)으로 포함되어 있어야 합니다.전이 종속성(Transitive Dependency)이란, 어떤 모듈이 직접 의존하는 다른 모듈이 다시 또 다른 모듈을 의존하고 있을 때, 최초의 모듈이 해당 모듈을 직접 선언하지 않았음에도 불구하고 간접적으로 의존하게 되는 관계를 의미합니다. Feature 모듈 구조에서는 의존성 방향..
구성요소에 모듈을 설치하면 이 구성요소의 다른 바인딩 또는 구성요소 계층 구조에서 그 아래에 있는 하위 구성요소의 다른 바인딩의 종속 항목으로 설치된 모듈의 바인딩에 액세스할 수 있습니다. Hilt는 Android 앱에서 의존성 주입(DI)을 쉽게 구현할 수 있도록 도와주는 라이브러리입니다. 내부적으로는 Dagger를 기반으로 하며, Android 컴포넌트와의 통합에 초점을 맞춰 개발자의 생산성을 높여줍니다. Android 개발에 특화된 DI 자동화Android의 주요 컴포넌트에 DI 컨테이너를 자동 연결컴포넌트의 수명 주기를 고려한 의존성 관리 지원@HiltAndroidApp, @AndroidEntryPoint 등을 통한 간결한 DI 설정DI 패턴을 표준화하여 팀 개발 및 테스트 코드 작성에 유리Dag..
Android 권장 아키텍처는 관심사 분리를 위해 코드를 역할별 클래스로 나누고, 이 과정에서 여러 작은 클래스들이 서로 의존성으로 연결됩니다. 이런 관계는 화살표로 표현한 의존성 그래프로 나타낼 수 있으며, 의존성 주입(DI)을 사용하면 의존성 연결과 테스트용 구현(가짜/모의 객체) 교체가 쉬워집니다.의존성 주입(DI)은 프로그래밍에 널리 사용되는 기법으로, 의존성 주입을 구현하면 다음과 같은 이점을 누릴 수 있습니다.코드 재사용 가능리팩터링 편의성테스트 편의성 의존성 주입(Dependency Injection, DI)클래스가 스스로 의존성을 만들거나 찾지 않고, 필요한 것을 주입받아 사용하는 방식입니다.DI을 실행하는 두 가지 주요 방법은 다음과 같습니다. 생성자 삽입: 클래스의 의존성을 생성자에 전..
