본문 바로가기

안드로이드/클린 아키텍처

[안드로이드 클린 아키텍처 시리즈] UI Layer 구현 1편 (with Hilt) #8


1. 안드로이드 클린 아키텍처 UI Layer 1편

안녕하세요, 지금까지 Data Layer와 Domain Layer에 대해 알아보았습니다. 이번 포스팅부터는 애플리케이션의 가장 전면에 있는 UI Layer를 구현할 차례입니다. UI Layer는 사용자와의 직접적인 상호작용을 담당하며, 사용자 경험을 결정짓는 중요한 역할을 합니다. 먼저, UI Layer의 구현을 위한 첫걸음으로 Hilt를 이용한 의존성 주입에 대해 설명하고 Hilt를 사용하기 위한 기본 세팅을 진행하겠습니다.

UI Layer에서 Hilt 기본 세팅과 관련된 파일
hilt를 사용하기 위한 기본 세팅과 관련된 파일

2. Hilt를 통한 의존성 주입의 필요성

Hilt는 Dagger를 기반으로 한 Android의 의존성 주입 라이브러리입니다. 존성 주입(Dependency Injection, DI)은 소프트웨어 디자인 패턴 중 하나로, 컴포넌트 간의 결합도를 낮추고, 모듈성을 높이며, 테스트 용이성을 개선하는 데 도움을 줍니다. 구글 개발자 문서에서도 의존성 주입을 위해 Hilt 사용을 추천하고 있습니다.

즉, U
I Layer의 ViewModel에서 UseCase를 활용할 때, 의존성 주입을 통해 사용하는 것이 일반적입니다. 또한, UseCase는 Repository에 접근해야 하기 때문에 Repository 의존성도 주입해주어야 합니다. Repository는 DataSource에 접근해야 하기 때문에 DataSource도 의존성 주입을 해주어야 합니다. 이러한 연쇄적인 형태로 Domain Layer, Data Layer에서 정의한 UseCase, Repository, DataSource, Retrofit 등을 활용하기 위해서 UI Layer에서 의존성 주입 코드를 작성하게 됩니다.

2-1. gson, hilt, retrofit, okhttp 의존성 추가

먼저 의존성 주입과 관련된 라이브러리들을 추가하겠습니다. 이번 예제에서는 gson, hilt, retrofit, okhttp를 아래와 같이 추가했습니다.

dependencies {

    implementation(project(":domain")) // Domain Layer에 대한 의존성
    implementation(project(":data"))   // Data Layer에 대한 의존성

    // GSON
    implementation("com.google.code.gson:gson:2.9.1")

    // hilt
    implementation("com.google.dagger:hilt-android:2.48")
    ksp("com.google.dagger:hilt-android-compiler:2.48")
    implementation("androidx.multidex:multidex:2.0.1")
    implementation("androidx.hilt:hilt-navigation-compose:1.1.0")

    // Retrofit
    implementation("com.squareup.retrofit2:retrofit:2.9.0")
    implementation("com.squareup.retrofit2:converter-gson:2.9.0")
    implementation("com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:0.8.0")
    implementation("com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2")

    //okHttp
    implementation("com.squareup.okhttp3:okhttp:5.0.0-alpha.2")
    implementation("com.squareup.okhttp3:logging-interceptor:5.0.0-alpha.2")
    
    ...
}

2-2. Application Class에 @HiltAndroidApp 어노테이션 추가하기

@HiltAndroidApp 어노테이션은 애플리케이션의 최상위 컴포넌트를 나타냅니다. Hilt의 의존성 주입 기능을 애플리케이션 전체에 사용할 수 있도록 합니다. Hilt를 사용한다면 @HiltAndroidApp 어노테이션이 적용된 Application 클래스를 반드시 포함해야 합니다.

@HiltAndroidApp
class MyApplication : MultiDexApplication() {
    override fun onCreate() {
        super.onCreate()
    }
}

2-3. MainActivity에 @AndroidEntryPoint 어노테이션 추가하기

@AndroidEntryPoint 어노테이션은 Hilt를 사용하여 의존성 주입을 받을 안드로이드 컴포넌트(Activity, Fragment 등)에 적용됩니다. 이 어노테이션이 적용된 Activity(Fragment 등)는 Hilt 의존성 컨테이너에 의해 관리되고, 필요한 의존성을 @Inject 어노테이션을 통해 주입받을 수 있게 됩니다.

@AndroidEntryPoint
class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            CleanarchitectureexampleTheme {
                // A surface container using the 'background' color from the theme
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colorScheme.background
                ) {
                    Greeting("Android")
                }
            }
        }
    }
}

3. Hilt을 사용하기 위한 기본 세팅 정리

Hilt를 사용한 의존성 주입은 UI Layer에서 Domain Layer와 Data Layer의 구성 요소(UseCase, Repository, DataSource 등)를 효율적으로 활용하기 위한 작업입니다. Hilt를 통해 ViewModel과 같은 UI 컴포넌트에서 필요한 의존성을 자동으로 주입받음으로써, 애플리케이션의 개발과 유지보수가 용이해지며, 코드의 모듈성과 테스트 가능성이 향상됩니다.

다음 포스팅에서는 ViewModel에서 UseCase를 주입받는 코
드와 Hilt가 인스턴스를 어떤 방법으로 생성하고 주입하는지에 대한 내용을 설명하겠습니다.