! 안드 스터디는 현재 진행중. MVVM 구현을 위해 계속 공부중인데 오늘은 DI에 대해 적어보려 한다.
클래스 간에 의존관계가 있다는 것은 한 클래스의 내부가 바뀔 때 다른 클래스가 영향을 받는다는 것을 의미한다.
즉, 다시 말하면 A라는 클래스가 객체를 만들기 위해 B를 필요로 하는 것이다. 이때 B는 A의 의존의 대상이 된다.
예를 들자면 커피 회사가 커피를 생산하기 위해 원두 회사에 의존하는 것과 같다. 이떄 원두 회사는 커피 회사의 의존의 대상이 된다.
코드로 보면 다음과 같다.
class Coffee(){
lateinit var beans : Beans
init{
beans = Beans()
}
}
class Beans
Coffee 클래스 객체는 Beans 객체를 갖고 있고 이는 Beans 객체 없이는 Coffee 객체가 존재할 수 없음을 의미한다.
외부에서 의존 객체를 생성하여 넘겨주는 것을 의미
일반적인 객체 생성의 경우에는 클래스 안에서 사용할 객체를 생성하지만, 의존성 주입의 경우 외부에서 생성된 객체를 주입 받는 방식이다.
클래스간에 강하게 결합될 경우 관리가 어려워질 수 있고
하나의 클래스가 변경될 경우에 그와 의존 관계인 모든 클래스를 변경해야 한다. 그러므로 container라 불리는 외부 인스턴스를 만들어서 이 클래스가 필요한 각 클래스에 주입하는 것이다.
코드의 재사용률을 높인다.
보일러 플레이트 코드가 제거된다.
객체의 생성과 사용을 분리시키고 종속된 코드를 줄여준다.
DI에는 HILT, koin, dagger2의 여러가지 라이브러리가 있다.
HILT : Google의 Dagger를 기반으로 하여 만든 의존성 주입 라이브러리로 안드로이드에 특화된 라이브러리이다.
dagger2 : Java/kotlin을 위한 의존성 주입 프레임 워크이다. 컴파일 단계에서 의존성을 주입한다. 러닝 커브가 상당히 높은 편...
koin : 순수 kotlin으로 작성된 의존성 주입 프레임 워크이다. dagger2와 달리 런타임 단에서 의존성을 주입한다. 러닝 커브가 낮은 편!
^ 컴파일 단계 : 소스코드 작성 후 컴파일이라는 과정을 통해 기계어 코드로 변환 되어 실행 가능한 프로그램이 되는 과정
^ 런타임 : 응용프로그램이 동작되어지는 때
single{} : 싱글톤 객체 생성
factory{} : 주입 할 때마다 인스턴스를 생성
viewModel{} : vivewModel 인스턴스 생성
bind() : 지정된 컴포넌트의 타입을 추가적으로 바인딩
get() : 생성된 객체 중에 알맞은 객체 주입
(코드는 리팩토링 후 올릴예정)
참고링크
https://kotlinworld.com/120?category=924584
https://salix97.tistory.com/265