의존성 주입이란?

의존성 주입은 객체가 필요로 하는 다른 객체를 직접 생성하는 대신에, 이를 외부에서 전달받는 방식으로 구현하는것. 쉽게 말해 내가 무엇이 필요하면 직접 만드는 것이 아니라 전달받도록 요청하는것

일반적인 객체 생성과 DI를 적용한 객체 생성 비교

일반적인 객체 생성과 DI를 적용한 객체 생성 비교

장점으로는 객체간의 결합도를 낮추고 테스트를 편리하게 하게 도와준다(개발시간이 상당히 단축됨). 객체를 외부에서 생성하기 때문에 변경사항을 하나하나 전부 적용하지 않아도 되기 때문이다. 단위 테스트 코드 작성이 편리해지는 이유는 의존성 주입을 받으면 실제 객체를 직접 사용하지 않아서 모의 객체를 생성하기 쉬워지기 때문이다.

But 규모가 너무 작거나 유지보수를 염두에두고 개발한 서비스가 아닌 이상 DI 적용이 필수는 아님

주입 방식으로는 생성자 주입, 필드 주입, 수정자 주입이 있다. (생성자 주입이 권장됨)

Dagger Hilt

Dagger Hilt는 Dagger 라이브러리를 기반으로 하는 안드로이드 개발에서 권장되는 의존성 주입 방식이다. Dagger보다 러닝커브가 낮고 코드가 간소화 되었다.

Dagger2

Dagger는 컴파일 타임에 코드를 생성하여 의존성을 주입하는 방식을 사용한다. 이를 통해 런타임에서 발생할 수 있는 오류를 컴파일 타임에 미리 방지할 수 있다. 또한 Dagger는 생성된 코드를 기반으로 런타임 시 객체를 생성하므로 객체 생성에 필요한 리소스를 최소화하여 성능을 향상시킬 수 있다.

Koin

Koin은 Kotlin 개발 환경에 쉽게 적용할 수 있는 경량화된 의존성 주입 방식이다. 별도의 어노테이션을 사용하지 않기 때문에 컴파일 시간이 단축되며 ViewModel 주입을 쉽게 할 수 있는 별도의 라이브러리를 제공한다는 장점이 있다. 에러를 검출하는 시점이 컴파일이 아닌 런타임 시점이라는 단점이 있다.

비교

Dagger2 Koin Hilt
러닝커브 높음 낮음 낮음
Java O X O
Kotlin O O O
에러 검출 시점 컴파일 시점 런타임 시점 컴파일 시점

요약

의존성 주입은 클래스와 클래스간에 관계를 맺을 때, 내부에서 직접 생성하는 것이 아닌, 외부에서 주입을 함으로써 관계를 맺게 만드는 것을 의미한다.

이미지 참고

https://spoqa.github.io/2020/11/02/android-dependency-injection-with-koin.html

https://velog.io/@sysout-achieve/Android-DI-Framework-선택지Dagger2-Koin-Hilt