Search
📱

DI 라이브러리

날짜
2024/09/26
파트
안드로이드
서기
블로그 업로드 여부

총대마켓 Hilt 적용 PR

안드로이드에서 DI 라이브러리가 필요한 이유

레벨 3까지 총대마켓은 의존성을 수동으로 주입해 주었다. 의존성을 수동으로 주입하지 않고, DI 라이브러리를 통해 자동으로 주입하면 어떤 장점이 있을까? 크게 아래의 두 가지 장점이 있다.
1.
DI 라이브러리는 의존성 주입에 필요한 코드를 자동으로 생성해주기 때문에 보일러플레이트 코드를 줄일 수 있다.
2.
의존성의 scope 와 lifecycle 을 직접 관리할 필요가 없다. 어노테이션과 같은 방법으로 라이브러리에게 알려주면 라이브러리가 알아서 관리해준다.
단순히 코드량이 줄어드는 것 뿐만 아니라 개발자의 실수로 같은 객체가 여러번 생성되어 메모리가 낭비되거나, 객체를 소멸시키지 않아 메모리 누수가 발생하는 등의 문제를 방지할 수 있다.

의존성 수동 주입 시

의존성을 수동으로 주입했을 때.. 보일러 플레이트 코드가 너무 많다 (밑에 더많음)

DI 라이브러리를 통해 자동으로 의존성 주입 시

깔끔하게 정리되었다!

Hilt 선택 이유

안드로이드에서 사용할 수 있는 DI 라이브러리는 크게 세 가지가 있다. 각각의 간략한 특징을 정리하면 다음과 같다.

1. Koin

코틀린으로만 만들어진 코틀린 DI 라이브러리.
러닝커브가 낮고 사용법이 쉽다.
리플렉션을 통해 런타임에 의존성을 주입한다.

2. Dagger2

컴파일 타임에 의존성 주입 코드를 생성하고 의존성을 주입한다.
러닝커브가 비교적 높다.

3. Hilt

Dagger를 기반으로 한 Jetpack의 권장 라이브러리.
Dagger2와 특징을 대부분 공유하며 Dagger보다 좀 더 안드로이드에 최적화 되어있다.
Hilt는 Dagger2의 장점을 모두 갖고 있으면서 안드로이드에 더욱 최적화 되어 있으므로 Hilt와 Koin 중 선택하기로 했다.

Hilt vs Koin

Hilt
Koin
최적화
안드로이드에 최적화
코틀린에 최적화
의존성 주입 시점
컴파일타임 의존성 주입
런타임 의존성 주입
의존관계 파악
의존 관계 파악이 쉬움
의존관계 파악 어려움
러닝커브
비교적 높음
낮음
주입 방식
DI
서비스 로케이터
Koin의 가장 큰 단점은 런타임 의존성 주입이라고 생각했다. 리플렉션을 통해 런타임에 주입하기 때문에 의존성 누락이나 오류를 런타임에만 확인할 수 있다. 의존성을 잘못 정의하더라도 런타임에 에러가 발생하기 전까지는 이를 알아차리기 어렵다.
반면 Hilt는 리플렉션을 사용하지 않고 컴파일 타임에 의존성을 주입하기 때문에 의존성 관련 오류를 컴파일 시 즉시 확인할 수 있다. 따라서 의존관계 파악에 있어서 Koin보다 유리하다.
또한 Hilt는 @HiltAdroidApp , @AndroidEntryPoint 과 같은 어노테이션들도 존재하며 이들이 안드로이드 구성요소와 밀접히 연관되어 있어 안드로이드 Lifecycle과도 자연스럽게 통합된다. 이러한 장점들 덕분에 Jetpack에서도 Hilt의 사용을 권장하고 있기도 하다!
따라서 안드로이드에 최적화 되어있고 안드로이드 프로젝트에서는 Hilt의 장점이 많다고 생각했다.
Hilt의 단점으로 러닝커브가 비교적 높기는 하지만 감수할 수 있는 단점이라고 판단했다. 따라서 총대마켓 프로젝트에서는 Hilt를 도입하기로 결정했다.
참고문헌