ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Dragger-Hilt (Android Dependency Injection)
    Android 2023. 10. 30. 11:54

    DI

    OOP(객체지향프로그래밍)에서 객체 간의 관계가 연관을 맺을 수 있도록 코드를 구성하는 것을 의존성 주입(의존관계구성)이라 함

     

    의존성 주입방법

    • Constructor Injection
    • Function@Method(Setter) Injection
    • Field Injection
    • Service Locator Pattern

     

    의존성을 주입하는 방법

    • 수동주입(종속 항목 수동 삽입)
    • DI Framework을 이용한 주입(hilt)

     

    장점

    • 코드의 재사용성
    • 익숙해지면 가독성이 좋음
    • 코드를 분리하여 구성하므로 리팩토링이 용이하다
    • 코드를 객체관점에서 분리하여 구성할 수 있어 테스트가 용이하다 => 실제 비지니스 로직과 연관된 부수적 작업을 분리하여 개발 가능
    • scopre(생명주기)를 이용한 관리

    Dagger

    • java/kotlin을 위한 의존성 주입 Framework
    • 의존성(종속관계)주입을 Annotation을 이용해 표현
    • 안드로이드에 특화된 DI Framework은 아님
    • 러닝 커브가 심하다

    Koin

    • kotlin에 최적화된 의존성 주입 framework
    • kotlin DSL(도메인 특화 언어)기반으로 만들어짐
    • kotlin개발 환경에 쉽게 적용할 수 있는 가벼운 di프레임워크
    • dagger2에 비해 사용법이 쉽고, DSL을 기반하여 RUNTIME에 의존성을 주입 => runtime error가 발생할 수 있고 compile시점에서 오류 확인이 어렵다

    Hilt

    • Dagger를 기반으로 만들어진 DI Framework로 Dagger2와 비슷한 동작 방식
    • Hilt는 구글에서 관리
    • 낮은 러닝 커브
    • Android DI Framework의 거의 표준으로 굳어가는 추세
    • 보통 Dagger-Hilt로 지칭

     

    Dagger2

    @Component

    하나 이상의 애플리케이션 객체를 생성하고 반환하는 인터페이스 또는 추상 클래스를 구현하도록 Dagger2에게 지시하는 역할 (only interface, abstract class에서만 가능)

    의존성 주입을 하는 가장 기본적인 요소에 해당

    객체 간의 결합도를 최대한 느슨하게 하기 위한 용도로 사용

     

    @Module

    @Component에 연결되어 의존성 객체를 생성하는 역할

    @Component는 @Module에 의존하여 객체를 생성

     

    @Provides

    @Module에서 인스턴스를 제공하는 역할을 담당

    @Module의 함수(메서드)에서만 존재할 수 있다

    @Provides 함수만 포함하는 @Module은 object class로 선연 o

     

    @Binds

    @Provides와 같은 역할을 담당

    @Provides와 달리 제약조건이 존재

    - 추상클래스의 추상 메소드에만 사용가능

    -@Binds가 선언된 메서드는 반드시 하나의 인자만 존재해야 함

    -인자로 주어진 타입과 다른 타입을 리턴해야 한다(같은 경우 반복주입이 이루어짐)

    -@Provides를 같이 사용하려면 추상클래스 이므로 companion object로만 가능

     

    @Inject

    Dagger2는 의존 그래프를 만든 후 의존성을 주입하는 library

    private 필드(속성)에는 선언하면 안됨(error발생)

    dependency graph(의존성이 필요한 곳, 제공하는 곳)을 이어주는 역할

    인터페이스, 추상 클래스에는 선언 할 수 없다

    코틀린 field(속성)에 선언 시 lateinit var 로 속성을 선언해야 한다

     

    @Named

    같은 타입의 @Procides가 존재할 때 구분 지어 주입하기 위함

    dagger2는 주입을 요청했을 때 module에 선언된 자료형과 동일한 객체를 기본적으로 주입해 준다

    module에 동일한 객체타입들이 여러 개 존재할 경우 컴파일 eror을 발생

    -> dagger2는 interface 선언하고 하위객체를 만들어 사용하길 권장

    -> 같은 상위타입을 가진 하위객체들이 존재할 가능성이 많음

     

    @Qualifier

    @Named는 문자열 이름을 부여

    @Qualifier는 annotation을 만들어 구분 짓는 것

    @Provides와 @Inject에 @Qualifier annotation을 선언하여 구분

     

     

    Hilt

    @HiltAndroidApp

    Hilt에 기반 DI안드로이드 프로젝트는 @HiltAndroidApp으로 주석이 지정된 Application클래스를 만들어야 함

    Hilt Application객체의 life cycle과 연결되어 hilt관련 종속 ㅎㅇ목을 사용

    'Android' 카테고리의 다른 글

    android studio 코드정리 단축키  (0) 2022.08.28
Designed by Tistory.