본문 바로가기
Android & Kotlin/Android

[Android Kotlin] 의존성 주입 Hilt, koin

by 말린밴댕이_공부 2024. 1. 3.
반응형

의존성 주입이란?

안드로이드에서 의존성 주입은 객체 지향 프로그래밍에서 사용되는 소프트웨어 디자인 패턴 중 하나 입니다.

의존성 주입은 객체가 다른 필요로 하는 객체에 대하여 직접 생성하는 것이 아닌 외부에서 주입을 받게 되는 패턴 입니다.

의존성 주입은 주로 세 가지 방식으로 이루어집니다.

  1. 생성자 주입: 의존성을 객체의 생성자를 통해 주입하는 방식입니다.
  2. 메서드 주입의존성을 메서드의 매개변수를 통해 주입하는 방식입니다.
  3. 속성 주입: 의존성을 객체의 프로퍼티나 세터 메서드를 통해 주입하는 방식입니다.

의존성 주입을 통해 객체는 직접적으로 자신이 필요로 하는 의존성을 생성하지 않고 외부에서 주입받아 사용합니다.

이를 통해 결합도를 낮추고, 유연하고 테스트 가능한 코드를 작성할 수 있습니다.

Hilt란 무엇인가?

Hilt는 Google의 Dagger를 기반으로 만든 Dependency Injection(의존성 주입) 라이브러리입니다.

객체간 의존성을 관리하는 것은 매우 복잡한 일이라고 생각되며 Hilt를 통해 프로젝트의 모든 클래스에 Container를 제공해주며 수명주기를 자동으로 관리하게 되어 애플리케이션에서 DI (의존성 주입)을 할 수 있도록 지원해줍니다.

Hilt를 적용한 이유

  1. 간편한 구현: Hilt는 Dagger의 복잡한 설정을 간소화하고, 안드로이드 앱에서 일반적으로 발생하는 패턴에 대한 기본 설정을 제공하여 의존성 주입을 더 쉽게 구현할 수 있습니다.
  2. 안드로이드와의 통합: Hilt는 안드로이드와의 통합을 고려하여 설계되었으며 안드로이드 앱의 수명주기와의 적절한 통합, 컴포넌트의 범위 설정 등을 편리하게 다룰 수 있습니다.
  3. 코드의 가독성과 유지보수성: 의존성 주입은 코드의 가독성과 유지보수성을 향상시키는데, Hilt는 이러한 측면에서 효과적이라 판단하였습니다.
  4. 테스트 용이성: Hilt를 사용하면 의존성 주입을 통해 테스트하기 용이한 코드를 작성할 수 있습니다.

Hilt를 사용하지 않았을 때와 사용할 때

class MyViewModelFactory(private val repository: Repository) : ViewModelProvider.Factory {
    override fun <T : ViewModel?> create(modelClass: Class<T>): T {
        if (modelClass.isAssignableFrom(MyViewModel::class.java)) {
            return MyViewModel(someDependency) as T
        }
        throw IllegalArgumentException("뷰모델 클래스 알 수 없음")
    }
}

class MyViewModel(private val repository: Repository) : ViewModel() {
 
}

class MyActivity : AppCompatActivity() {

    private lateinit var viewModel: MyViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val repository = Repository() 
        val viewModelFactory = MyViewModelFactory(repository)
        viewModel = ViewModelProvider(this, viewModelFactory).get(MyViewModel::class.java)
    }
}
@HiltViewModel
class MyViewModel @Inject constructor(private val repository: Repository) : ViewModel() {
   
}

@AndroidEntryPoint
class MyActivity : AppCompatActivity() {

    private val viewModel: MyViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
}

기본적인 의존성 주입 패턴과 Hilt를 이용하여 의존성 주입을 하였을 때의 차이점으로 코드의 의존성 주입방식과 간결성,유연성,테스트 용이성을 고려하면 Hilt를 안 쓸 이유가 없어 보입니다.

Hilt vs Koin

  • Koin
    • Kotlin을 기반으로 한 경량의 의존성 주입 프레임워크.
    • 간단하고 가독성이 좋으며, Dagger에 비해 덜 번거로운 구성이 가능하지만 실행 시에 동적으로 의존성을 생성하므로 Dagger보다는 성능이 떨어질 수 있음
    • 명시적인 호출 (아래 코드) → koin 컨테이너에서 의존성을 가져옴
    val myService: MyService = get()
    
    val myService: MyService by inject()
    
    myService.myFunction()
    
  • Hilt
    • Dagger를 기반으로 하는 안드로이드 전용 의존성 주입 프레임 워크.
    • Dagger의 특징을 유지하면서도 안드로이드 개발에 특화된 기능을 추가하며 안드로이드 앱에서의 편리한 사용과 강력한 기능을 제공하며, Dagger와의 연동이 원활

차이점은 확실하다.

  • 일부 클래스 주입 vs 모든 클래스를 서비스 로케이터를 통한 종속
  • 명시적 호출 x vs 명시적 호출
  • 의존관계 파악 쉬움 vs 어려움

[래퍼런스]

DI 공식문서1

DI 공식문서2

Hilt 공식문서

hilt vs koin 뱅크샐러드 기술문서

반응형

댓글