[안드로이드스튜디오_문화][Hilt를 사용해서 의존성 주입하는 방법]

기말 지하기포·2024년 1월 13일
0

-의존성주입에 있어서의 관계의 구성요소는 두가지가 있다. 의존성을 요청하는 클라이언트와 의존성의 생명주기를 관리하고 클라이언트에게 의존성을 주입해주는 컨테이너 이렇게 두가지가 존재한다.

-이를 Hilt에 적용하면 클라이언트는 안드로이드 클래스이고 , 컨테이너는 Hilt Component 이렇게 적용된다. 즉, 안드로이드 클래스가 Hilt Component에게 컴파일 타임에 의존성을 요청하면 , Hilt Component는 안드로이드 클래스에게 런타임에 의존성을 주입해주고 . 의존성의 생명주기를 관리해준다.

-Hilt Annotation Processor가 컴파일 타임에 Annotation Processing을 통해서 의존성 그래프를 검사하여서 문제가 없는지 확인하고 의존성 주입을 위한 코드를 생성한다. 이렇게 생성된 코드들이 런타임 시 실행되면서 의존성 주입을 가능하게 한다.

  • 참고 : 안드로이드 클래스가 의미하는 것은 (애플리케이션) (액티비티) (서비스) (프레그먼트) (브로드캐스트리시버) (뷰모델) 이런 것들을 의미한다.

Hilt의 의존성 바인딩

바인딩의 의미

-바인딩이란 , Hilt Component에 의존성을 추가하고 의존성의 생명주기를 관리하는 행위를 의미한다.

-또한, 하나의 의존성 자체를 바인딩이라고 하는 경우도 있으므로 문맥상 어떤 것이 어울리는지 생각해보아야 한다.

Hilt에서 Module을 통한 바인딩

Hilt Component에 바인딩하는 방법

-1. 모듈 클래스에 @Provide Annotation을 마킹하는 방법

-2. 생성자에 @Inject Annotation을 마킹하는 방법

Hilt 의존성 전체 그림


-위의 이미지는 Hilt 의존성에 관련한 전체적인 그림이다. 컴파일 타임에 위 그림에 대한 오류를 찾는 과정을 거친다.

Inject

생성자를 통해 의존성을 주입 할 때 사용

  • 예시코드 (1) + 사용법 설명
  • 클래스의 생성자 앞에 @Inject를 마킹하면 된다. 그럼 생성자에 들어있는 객체에 대한 의존성을 Hilt Component에 요청하고 런타임에 주입을 받아서 사용 할 수 있다.
  • 생성자 파라미터로 주입을 받았기 때문에 클래스를 인스턴스화 할 때 부터 해당 의존성을 참조 할 수 있다.
class Food @Inject construct(pizza : Pizza) {
	blah~blah~
}

생성자 주입과 바인딩은 동시에 발생한다.

-@Inject를 통해서 생성자 주입을 진행하면 파라미터를 Hilt Component로부터 주입을 받기도 하지만 , 주입을 받음과 동시에 해당 클래스(주입 받는 대상) 또한 Hilt Component에 바인딩이 된다.

필드를 통해 의존성을 주입 할 때 사용

  • 예시코드(1) + 사용법 설명
  • 안드로이드 클래스에서는 생성자 주입을 할 수 없기 때문에 필드롤 통해 의존성을 주입하는 것을 많이 사용한다.
  • 안드로이드 클래스에 필드 주입 또는 메서드 주입을 하고 싶은 경우에는 @AndroidEntryPoint를 필수적으로 마킹해야 한다.
  • 필드 주입을 하는 경우에는 안드로이드 클래스의 필드에 @Inject를 마킹한 후에 lateinit을 사용해서 주입받는다. lateinit을 사용하지 않고 Nullable을 통해서 주입을 받을 수 있지만 되도록이면 Null을 사용하지 않는 것이 코틀린의 지향점이기 때문에 lateinit 키워드를 활용해서 늦은 초기화 변수로 선언을 하고 주입 받는 것이 가장 일반적인 방식이다.
  • 안드로이드 클래스의 경우 안드로이드 시스템이 직접 인스턴스화를 하기 때문에 생성자 주입을 하는 것은 불가능하기 때문에 필드 주입 또는 메서드 주입만 가능한 것이다.
@AndroidEntryPoint
class AndroidClass : {
	@Inject
    lateinit var pizza : Pizza
}

메서드 주입 할 때 사용

  • 예시코드(1) + 사용법 설명
  • 메서드 주입은 잘 활용되는 방식은 아니다.
  • 안드로이드 클래스의 경우 안드로이드 시스템이 직접 인스턴스화를 하기 때문에 생성자 주입을 하는 것은 불가능하기 때문에 필드 주입 또는 메서드 주입만 가능한 것이다.
  • 메서드 위에 @Inject를 마킹하는 것을 의미하는데 그러면 메서드의 파라미터에 주입을 요청할 의존성을 넣어주고 해당 의존성이 각각의 안드로이드 클래스 별 의존성 주입 시점에 주입이 된다.(ex : Activity -> onCreate 시점)
@AndroidEntryPoint
class AndroidClass : {

	@Inject
    fun setPizza(pizza : Pizza) {
    
    }
}
profile
포기하지 말기

0개의 댓글