[Android]Hlit이란?

Taewoo Kim·2025년 1월 10일
0

[Android]

목록 보기
11/11

1. Dependecy Injection, DI란?

  • 객체 간의 의존성(Dependency)을 직접 생성하지 않고 외부에서 주입받아 사용하는 설계 패턴.
  • 코드의 유연성과 재사용성을 높이고 테스트를 더 쉽게 만들어 줌.
  • DI는 객체 생성 및 관리 책임을 클라이언트 객체가 아닌 별도의 주입자(Injector에게 위임하는 방식으로 동작.

DI의 주요 개념

  1. 의존성(Dependency)
  • 클래스가 다른 클래스 또는 객체에 의존해 동작하는 경우, 이를 의존성이라고 함
class Car {
    private val engine = Engine() // 의존성
}
  1. 의존성 주입(Dependency Injection)
  • 위 예제에서 Car 클래스가 직접 Engine 객체를 생성하는 대신, 외부에서 Engine 객체를 주입받는 방식으로, 이를 통해 객체 간 결합도를 낮추고 코드의 유연성을 높임.
class Car(private val engine: Engine) // 의존성 주입

DI의 주요 방법

1. 생성자 주입(Constructor Injection)

의존성을 클래스의 생성자를 통해 주입. 가장 일반적이며 권장되는 방식.

class Car(private val engine: Engine)

2. 메서드 주입(Method Injection)

의존성을 메서드를 통해 주입. 특정 상황에서 의존성을 변경하거나 필요할 때만 주입받고 싶을 때 사용

class Car {
    private lateinit var engine: Engine

    fun setEngine(engine: Engine) {
        this.engine = engine
    }
}

3. 필드 주입(Filed Injection)

의존성을 클래스의 필드(속성)에서 직접 주입
이 방식은 주로 DI프레임워크에서 지원하며, 테스트 코드나 간단한 예제에서 사용

class Car {
    @Inject
    lateinit var engine: Engine
}

DI의 장점

  1. 결합도 감소
    클래스가 다른 객체를 직접 생성하지 않으므로, 객체 간 결합도가 낮아짐.
    이는 유지보수성확장성을 크게 향상.

  2. 테스트 용이성
    의존성을 외부에서 주입받으므로, 테스트 시 Mock 객체를 쉽게 주입하여 다양한 상황을 시뮬레이션할 수 있음.

  3. 재사용성 향상
    클래스가 특정 구현에 종속되지 않으므로, 다양한 의존성을 주입받아 재사용할 수 있음.

  4. 유연성 및 확장성 증가
    새로운 기능이나 객체를 추가하더라도 기존 코드를 수정할 필요가 줄어듬

DI의 단점

  1. 초기 학습 곡선
    DI 패턴을 이해하고 적용하는 데 시간이 필요합니다.

  2. 복잡성 증가
    프로젝트가 작거나 간단한 경우, DI를 도입하면 오히려 복잡해질 수 있습니다.

  3. 의존성 관리 필요
    의존성을 관리하는 데 추가적인 도구나 프레임워크(Hilt, Dagger 등)가 필요할 수 있습니다.

Hilt란?

DI를 간편하고 효율적으로 구현하기 위해 Google에서 제공하는 DI 라이브러리.

Dagger를 기반으로 만들어졌으며, DI를 더 쉽게 사용할 수 있도록 Android 환경에 최적화된 API와 통합 기능을 제공

Hilt의 주요 특징

  1. Dagger 기반
    Hilt는 Dagger 위에 구축되어 있으므로, Dagger의 강력한 성능과 안정성을 유지하면서도 사용법을 간소화.

  2. Android에 특화된 통합 기능
    Hilt는 Activity, Fragment, ViewModel 등 Android 컴포넌트와 DI를 원활하게 통합할 수 있도록 설계.

  3. 의존성 제공 관리
    Hilt는 의존성을 주입하고 관리하는 데 필요한 코드를 자동으로 생성하므로, 수동으로 팩토리나 구성요소(Component)를 정의할 필요가 없음.

  4. 범위(Scope) 관리
    Hilt는 Android 생명 주기에 따라 의존성의 범위를 자동으로 관리합니다. 예를 들어, @Singleton으로 정의된 의존성은 앱 전체에서 동일하게 유지.

Hilt의 주요 구성 요소

1.Hilt Modules

  • 의존성을 제공하는 객체를 정의하는 클래스
  • @Module과 @InstallIn을 사용하여 Hilt에서 사용할 범위를 지정
@Module
@InstallIn(SingletonComponent::class)
object AppModule {
    @Provides
    @Singleton
    fun provideDatabase(@ApplicationContext context: Context): AppDatabase {
        return Room.databaseBuilder(
            context,
            AppDatabase::class.java,
            "app_database"
        ).build()
    }
}

2. Annotations

Hilt는 다양한 애너테이션을 통해 DI를 설정

  • @Inject: 생성자나 필드에 의존성을 주입.
  • @HiltAndroidApp: Application 클래스에 선언하여 Hilt 초기화를 설정.
  • @Singleton: 의존성을 싱글톤으로 관리
  • @ActivityRetainedScoped, @ViewModelScoped: 특정 Android 컴포넌트 생명 주기에 따라 의존성 범위를 관리

3. Components

Hilt는 Android의 각 구성 요소에 DI를 지원하기 위해 사전 정의된 컴포넌트를 제공

  • SingletoneComponent: 앱 전체에서 공유되는 의존성을 관리
  • ActivityComponent, FragmentComponent: 특정 생명 주기 내에서 의존성을 관리.

Hilt 사용 시 장점

  1. 코드 간소화
  2. Android 생명 주기와의 통합
  3. 테스트 용이성

0개의 댓글