[Android, Kotlin] DI(Dependency Injection), 의존성 주입
Android

[Android, Kotlin] DI(Dependency Injection), 의존성 주입

Dependency
의존성

함수에 필요한 클래스, 객체 등에 의존하는 것. 한 객체가 다른 객체를 참조(다른 객체와 상호작용)하는 것

 

 

 

위 같은 코드에서 DefaultRestaurantFoodRepository 클래스는 FoodApiService에 종속되어 있다라고 한다.

의존성이 높아지게 되면, 두 객체 간 결합도(coupling)가 높아지게 된다.

한 객체의 코드가 변경되면 다른 객체의 코드도 변경되어야 하므로, 유지보수 및 리팩토링의 불편함이 존재한다.

 

DI (Dependency Injection)
의존성 주입

Dependency Injection(의존성 주입) - 의존성이 필요한 클래스, 객체 등을 내부적으로 생성하여 사용하는 것이 아닌, 외부에서 생성해 주입해 주는 것.

* 객체의 생성 , 생명주기 관리가 컨테이너에 의해 제어되는 IOC(Inversion Of Control, 제어 역전)를 통해 이루어진다.

 

장점

- 일일히 내부적으로 객체를 생성하는 번거로움을 줄임으로써 Developer 입장에서 개발에 집중 할 수 있도록 함

- 클래스 간 결합도를 낮춤으로써 유지보수에 편리 (Decoupling). 변경에 민감해지지 않음

- 코드의 재사용성 증가

- 유닛 테스트의 용이성. Mock Object 생성을 DI를 통해 주입함으로써 유연하게 테스트 할 수 있다.

- 외부에서 객체를 생성해 주입하는 DI는 MVP, MVVM과 같이 서로간의 Dependency를 최소화 하기 위해 만들어진 아키텍처 패턴에서 필수적임.

단점

- DI를 통해 주입된 객체들에 관한 코드의 추적이 어려움.

 

 

 

관련 라이브러리
Dagger2 vs Koin

 

Dagger2 : Square 사에서 만든 DI 프레임워크로, 현재는 구글이 Square 사의 Dagger를 Fork하여 Dagger2로써 관리 중.

높은 러닝커브. Annotation을 통해 보일러 플레이트 코드를 줄이고, 리플렉션 사용 없이 컴파일 타임에 예외처리 확인 가능.

Koin : Kotlin 개발 환경에 쉽게 적용 할 수 있는 경량화 된 DI 프레임워크. 낮은 러닝커브. 별도의 Annotation을 사용하지 않아 컴파일 시간 감소. View Model을 쉽게 Injection 할 수 있는 라이브러리 제공. 컴파일 타임에 에러 확인 불가능.