Android Dependency, Dependency Injection
Dependency(의존성)
-코드에서 두 모듈 간의 연결
-객체지향언어에서는 두 클래스 간의 관계라고도 말함.
-일반적으로 둘 중 하나가 다른 하나를 어떤 용도를 위해 사용함.
Dependency가 위험한 이유
-하나의 모듈이 바뀌면 의존한 다른 모듈까지 변경이 이루어지기 때문
-테스트 가능한 어플을 만들 때 의존성이 있으면 유닛테스트 작성이 어려움
-유닛 테스트의 목적 자체가 다른 모듈로부터 독립적으로 테스트하는 것을 요구하기 때문.(Mock 객체로 대체가능)
Dependency Injection(의존성 주입)이 필요한 이유
-위 Dependency가 위험한 이유를 해결하기 위해서 사용
-'new'를 사용해 모듈 내에서 다른 모듈을 초기화하지 않으려면 객체 생성은 다른 곳에서 하고, 생성된 객체를 참조하면 된다.
-의존성 주입은 Inversion of Control개념을 바탕으로 합니다. 클래스가 외부로부터 의존성을 가져야합니다.
-클래스는 다른 클래스를 인스턴스화해야 하지만, 구성 클래스에서 인스턴스를 가져와야 합니다.
-자바 클래스가 new연산자를 통해 다른 클래스의 인스턴스를 생성하면 해달 클래스와 독립적으로 테스트하고
사용할 수 없으며 이를 하드종속성이라고 합니다.
클래스 외부에서 종속성을 제공하면 생기는 이점
-클래스를 재사용 할 가능성을 높이고, 다른 클래스와 독립적으로 클래스를 테스트 할 수 있습니다.
-비즈니스로 로직의 특정 구현이 아닌 클래스를 생성하는데 매우 효과적
의존성 주입을 어떻게 할 것인가?
-Contructor Injection: 생성자 삽입
-Field Injection: 멤버 변수 삽입(비공개 안됨)
Method Injection: 메소드 매게 변수 삽입
JSR330에 따른 종속성 주입 순
1.Constructor
2.Field
3.Method
@Inject로 주석처리된 메소드나 필드가 호출되는 순서는 JSR330에 의해 정의되지 않습니다.
종속성 소비자는 커넥터를 통해 종속성 공급자의 종속성(Object)을 필요로 합니다.
1.Dependency provider: @Module어노테이션 된 클래스는 삽입 할 수 있는 객체를 제공합니다.
이러한 클래스는 @Provides어노테이션 메소드를 정의합니다(@Module->@Provides)이 메소드의 리턴된 오브젝트는
종속성 삽입에 사용 가능합니다.
2.Dependency consumer: @Inject 어노테이션은 의존성을 정의하는데 사용된다.
3.Connecting consumer and producer: @Component어노테이션 인터페이스는 객체 제공자(Module)와 의존관계를
표현하는 객체 사이의 연결을 정의합니다. 이 연결에 대한 클래스는 dagger에 의해 생성됩니다.
참조 :
https://tony-programming.tistory.com/entry/Dependency-%EC%9D%98%EC%A1%B4%EC%84%B1-%EC%9D%B4%EB%9E%80
'안드로이드' 카테고리의 다른 글
Firebase 설정, firebase콘솔에 앱등록 (0) | 2022.11.04 |
---|---|
[Android] EventBus, RxEventBus 사용법 (0) | 2022.10.27 |
[Android] DI란?, Dagger2 사용법에 대해 알아보자 (0) | 2022.10.27 |
[Android] Dagger에 대해 알아보자 (0) | 2022.10.27 |
[Android] Context에 대해 알아보자 (0) | 2022.10.27 |