본문 바로가기

[Android]/App UI 따라 만들기

[배달의 민족] 따라만들기 10-1편 (Dagger-Hilt)

안녕하세요! 무책임하게 다음 글을 올리지 않았습니다.

처음부터 다시 차근차근 같이 만들어 가보도록 하겠습니다.

이번 편은 시간이 지남에 따라,

몇몇 업데이트 및 MVVM의 꽃인 Dependency Injection(의존성 주입) 프레임워크인 Dagger Hilt를 사용하도록 하겠습니다.

 

[버전 업데이트 관련]

저도 오랜만에 Github에서 코드를 다운로드하여 실행해보았으며 문제없이 작동이 되는 것을 확인하였습니다.

먼저 오랜만에 프로젝트를 열었기 때문에 build.gradle 파일 내에 몇몇 버전이 업데이트되었습니다.

굳이 일일이 다 짚고 넘어갈 필요가 없기 때문에 업데이트한 프로젝트 파일을 깃허브에 올려놓았습니다.(아래 링크 참조)

필요시 해당 깃허브에서 프로젝트를 다운로드하시고 현재 글을 보며 따라 하시면 됩니다.

 

소스코드: github.com/DJDrama/BaeminPractice/tree/Version-Up

 

DJDrama/BaeminPractice

Contribute to DJDrama/BaeminPractice development by creating an account on GitHub.

github.com

 

[Why?]

의존성 주입이란?

 

James Shore에 의하면 Dependency Injection은 

"Dependency injection means giving an object its instance variables. Really. That’s it."

www.jamesshore.com/v2/blog/2006/dependency-injection-demystified

 

James Shore: Dependency Injection Demystified

When I first heard about dependency injection, I thought, “Dependendiwhatsit?” and promptly forgot about it. When I finally took the time to figure out what people were talking about, I laughed. “That’s all it is?” “Dependency Injection” is a

www.jamesshore.com

'즉 객체에게 인스턴스 변수를 주는 것이다'입니다.

 

즉 예를 들어 Car(자동차)이라는 객체가 있다고 가정합시다.

위와 같이 작성하게 되면 Car이라는 객체를 생성하게 될 경우, 모든 Car라는 객체는 동일한 스펙을 가지게 됩니다.

이렇게 될 경우, 모든 자동차는 동일한 스펙의 자동차가 돼버리기 때문에 만약 자동차를 생산하는 회사에서 한 가지의 자동차에 가격에 따른 다른 옵션을 넣을 수가 없게 됩니다.

즉 위 코드를 보면, Engine은 항상 "Good Engine"이며, Tire는 "Hankuk Tire" 등입니다. 즉 10대의 자동차 객체를 만들 경우, 그 10대의 자동차는 모두 동일한 스펙이라는 것입니다.

 

위와 같은 상황을 방지하기 위해 저희는 Constructor Injection을 사용하게 됩니다. 아래 코드를 보십시오.

위와 같이 클래스를 작성할 경우 아래 코드와 같이 다양한 Car 객체를 만들 수 있습니다.

참고로 Car 객체는 Engine, Tire, Belt 등의 객체를 필요로 하기 때문에 Engine, Tire 등의 객체에 의존성을 지니고 있다고 보면 됩니다. 

이렇게 의존을 하게 될 경우, 코드가 복잡해지고 방대해질 경우, 만약 Engine 객체가 하나의 parameter가 아닌 여러 개의 parameter을 요구하는 객체로 변경할 경우, Engine 객체를 의존하는 모든 Car 객체의 Constructor(생성자)에는 Engine 변화에 따른 코드를 모두 수정해야 합니다. 

 

이렇게 될 경우, 코드가 방대한 경우, 모든 Car 객체 생성 코드를 일일이 수정해야 하는 번거로움이 있습니다.

이러한 번거로움을 해결하기 위해 나타난 의존성 주입 프레임워크가 바로 Dagger입니다.

 

특히 MVVM에서 View는 ViewModel을 관찰하고, ViewModel에서는 Repository를 관찰하게 되는데, Constructor Injection을 이용해서 각각의 객체를 생성하였다고 가정해봅시다. 만약 viewModel이나 repository의 constructor에 변화가 일어날 경우, 해당 viewmodel과 repository를 객체로 사용하고 있는 class는 모두 소스 코드를 수정해야 하는 번거로움이 있습니다.

Dagger를 사용하게 될 경우, @Provides annotation을 이용하여 한번 선언해주면 @Inject annotation을 이용하여 어디에서나 자유롭게 constructor injection 없이 사용할 수 있게 됩니다. 수정이 필요할 경우에도 한번 선언한 코드만 수정하면 되므로 매우 매우 편리하죠. 지금은 머리가 복잡하겠지만, 앞으로 코드를 작성해 나가며 쉽게 설명드리겠으며 매우매우 쉽다는 것을 깨달을 것입니다!

 

Dagger는 구글에서 공식적으로 유지보수 및 지원하는 의존성 주입 라이브러리이기 때문에 신뢰성이 높고, 

다른 라이브러리와는 다르게 컴파일 타임에서 의존성 주입을 관리하기 때문에, 어떠한 객체가 잘못 주입되거나 하면 런타임에서 오류가 발생하는 것을 미리 방지할 수 있다는 장점을 가집니다. (Koin의 경우 런타임에서 의존성을 주입하기 때문에 잘못된 코드로 인하여 앱이 오작동할 수 있는 확률이 높죠. )

 

그럼 먼저 Dagger Hilt를 사용하기 위해 필요한 디펜던시들을 추가하도록 하겠습니다.

 

1) build.gradle (Project)  ('추가'라고 되어있는 부분을 추가)

2) build.gradle (app) ('추가'라고 되어있는 부분을 추가)

 

단순히 아래 링크를 보고 따라 하셔도 무방합니다.

developer.android.com/training/dependency-injection/hilt-android

 

Hilt를 사용한 종속 항목 삽입  |  Android 개발자  |  Android Developers

Hilt는 프로젝트에서 수동 종속 항목 삽입을 실행하는 상용구를 줄이는 Android용 종속 항목 삽입 라이브러리입니다. 수동 종속 항목 삽입을 실행하려면 모든 클래스와 종속 항목을 수동으로 구성

developer.android.com

 

Dependencies를 추가한 소스코드는 아래 링크에서 받으실 수 있습니다.

github.com/DJDrama/BaeminPractice/tree/Dagger-Hilt-Dependencies

 

DJDrama/BaeminPractice

Contribute to DJDrama/BaeminPractice development by creating an account on GitHub.

github.com

일단 오랜만이니 짧고 얇게 시작을 하도록 하겠습니다. 자주 포스트를 올려서 많은 도움을 드릴 수 있도록 하겠습니다.

 

그럼 이런 허접한 글 읽어주셔서 감사합니다~!

이 포스트가 좋으면 공감(하트) 부탁드립니다. 

모든 댓글과 질문은 늘 환영합니다!!