[안드로이드] DI/Hilt/Repository패턴

dada·2021년 12월 30일
3

Android

목록 보기
20/24
post-thumbnail

✅의존성 주입은 왜 필요할까?

  • 아주 잠깐 맛만보자면, 외부에서 Monitor인스턴스를 만들어 Monitor가 필요한 각 클래스에 주입한다.
    ->의존성 주입의 포인트는 인터페이스 타입을 통해 어떤 객체가 주입되어야하는지 알 수 있다는 것이다

  • ViewModel을 생성할때 MVVM으로 구현했다면 파라미터로 repository 객체를 받아야하는데, 이는 ViewModel이 respository에게 의존하고 있는 형태인것이다.(안드로이드의 아키텍쳐 의존성 방향을 생각해보면 presentation(ViewModel포함)->data->domain(repository포함) 순서로 의존성이 적음)

  • Activity나 Fragment에서 Viewmodel을 사용하기 위해서 ViewModelprovider로부터 ViewModel인스턴스를 get()받아와야하는데 이때, ViewModel의 인자로 repository객체가 들어가야 한다면 어떻게 해야할까?

  • 이런경우 ViewModelProvider.Factory를 커스텀하여 커스텀한 viewModelFactory를 만들어야한다. 매번 viewModelFactory를 만들어서 사용하면..보일러코드 증가는 물론 유지보수를 할때도 좋지 않다.

  • 그렇다면, ViewModel의 파라미터로 들어가야할 repository객체를 누군가 만들어서 넣어주면 내가 이 객체를 제어하지 않아도 되니까 개꿀아닐까? 맞다. 이게 의존성 주입의 시작이다.

✔의존성 주입 의의

  • 클래스 간 결합도가 약해져(한 클래스가 변경되어도 다른 클래스가 변경될 필요성이 적어진다), 리팩토링이 쉬워짐
  • 의존성 주입은 인터페이스를 기반으로 설계되고, 주입되기 때문에 코드를 유연하게 하며, 확장을 쉽게 한다.
  • UI가 있는 프로그램에서는 생명주기가 중요한데 생명주기별로 주입될 인스턴스를 저장하는 공간인 component,Module 을 관리할 수 있어서 리소스 낭비를 막는다

✔의존성 주입 용어

  • DI(Dependency Injection): 외부에서 의존 객체를 생성해서 넘겨주는 것. DI는 IOC(Inversion of Control=제어의 역전)을 구현하는 방법 중 하나다.
  • DI Framework: DI를 위해서는 '넘겨주는 무언가'가 필요하다. 이 '넘겨주는 무언가'의 역할을 하는게 DI Framework다.
    • DI Framework의 대표적인 종류로는 Dagger2, Dagger2 Hilt 가 있다.

✔DI Framework는 뭘까?

  • Dagger2의 등장
    • 지금까지 외부에서 객체를 주입하는 의존성 주입의 의의, 필요성을 봤다. 근데 앞에서처럼 UI가 있는 프로그램인 안드로이드 프로그램같은 경우 객체 별 생명주기 관리가 매우 중요하다. 근데 프로젝트가 커질수록 의존성 인스턴스들을 생명주기까지 고려하면서 잘 관리하는게 여간 쉽지 않다.
    • 의존성 인스턴스 관리좀 해주는 거 뭐 없나? 해서 등장한게 대표적인 DI Framework인 Dagger2이다.
    • DaggerHeroComponent.create().callHero()를 호출->Inject로 의존성 요청->SubComponent로부터 Module을 검색하고 Scope에 따라 객체를 가져와 주입
    • 근데 Dagger2는 러닝커브가 높다. 그래서 많은 사람들이 오픈소스 라이브러리인 Koin을 사용하지만 Koin은 엄밀히 DI는 아니다.
  • Koin
    • Koin은 Kotlin의 DSL을 활용한 Service Locater Pattern이라고 할 수 있다
    • Koin은 컴파일 시 많은 일처리를 하는 Dagger2에 비해 런타임때 일처리를 많이해서 런타임 퍼포먼스가 떨어진다.(Dagger2는 어노테이션 프로세싱을 활용해 컴파일 타임에 의존성 관련 코드를 생성해서 일처리를 열심히 해준다.)
  • 결국 안드로이드 JetPack에서 제공하는 전용 DI Framework인 Hilt가 등장했다.
    • Hilt의 목적: 초기 DI환경 구축 비용 절감
    • Hilt의 장점
      • Dagger2에서는 개발자가 직접 필요한 Component를 작성하고 상속관계를 정의했지만 Dagger2를 기반으로하여 만들어진 라이브러리이기때문에 안드로이드에서 표준적으로 사용되는 Component(의존성을 요청받고 객체를 생성해서 주입하는 역할), Scope(각 컴포넌트의 생명주기)를 기본으로 제공한다. 이때, 각 컴포넌트의 라이프 사이클을 자동으로 관리해주므로 초기 DI 환경 구축 비용이 감소한다.
      • 안드로이드에서 제공하는 라이브러리이다보니, JetPack의 ViewModel에 대한 의존성 주입 구현하기 좋다.

✅Hilt사용 시 주의할 것!

  • 라이브러리 적용 잘 하자. ViewModel에서 Hilt사용하려면 라이브러리 따로 implement해줘야하는거 잊지 말 것!
  • build gradle상단에 plugin도 추가해야한다.
  • project수준에서 classpath도 지정해야한다!
  • HiltAndroidApp 만든 후 manifests 파일에서 name설정 잊지말자~
profile
'왜?'라는 물음을 해결하며 마지막 개념까지 공부합니다✍

0개의 댓글

관련 채용 정보