티스토리 뷰
의존성 주입 (Dependency Injection) 이란❓
- 구성 요소간의 코드 내부가 아닌 외부에서 의존 객체를 생성하여 넘겨주는 디자인 패턴중 하나이다
// 내부에서 멤버로 생성
class Person{
private val dog = Dog()
fun walk(){
dog.walk()
}
}
fun main(args: Array) {
val person = Person()
person.walk()
}
- 먼저 위의 경우 Dog 클래스의 인스턴스를 Person 클래스 내부에서 생성해서 사용하게 된다
- 이 때, Person 클래스는 Dog 클래스에 의존성을 가지고 있다고 할 수 있는데 Dog 클래스에 변화가 생기면 Dog클래스를 참조하는 모든 클래스를 수정해줘야 한다
// 외부에서 생성자로 주입
class Person(private val dog : Dog){
fun walk(){
dog.walk()
}
}
fun main(args: Array) {
val dog = Dog()
val person = Person(dog)
person.walk()
}
- 위와 같이 수정을 하게되면 외부에서 Dog클래스의 인스턴스를 생성해 Person 클래스 객체를 만들 때 생성자로 주입을 해주게 되고, 만약 Dog클래스에 수정이 일어나더라도 Person클래스를 수정할 필요 없다!
- 이렇게 생성자 형태로 의존성을 주입하는 것을 "생성자 주입(Constructor Injection)" 이라고 한다
// 외부에서 멤버 변수에 접근
class Person{
lateinit var dog : Dog
fun walk(){
dog.walk()
}
}
fun main(args: Array) {
val person = Person(dog)
person.dog = Dog()
person.walk()
}
- 위와 같은 경우는 lateinit으로 객체를 선언한 후 person 객체를 생성한 후 dog 객체에 접근하고 있다
- 클래스가 시스템에 의해 생성되어 생성자로 주입을 할 수 없을 때 사용할 수 있다
- 이런 방법을 "필드/setter 주입 (Field/setter injection)"이라고 한다
의존성 주입의 장점❗️
- boilerplate code를 줄여주므로 유연한 프로그래밍이 가능하다
- 재사용성을 높아지고 유지보수에 용이하다
- 테스트에 용이하다
- 결합도를 낮춰 확장성을 높혀준다
koin 📣
- koin은 Android에서 kotlin을 위해 제공하는 DI 라이브러리이다
- koin DSL 키워드
- module - koin 모듈 생성
- factory - inject를 할 때 마다 객체를 생성
- single - app이 살아있는 전체 주기동안 전역적으로 사용할 수 있는 인스턴스를 생성
- bind - 생성할 객체를 다른 타입으로 바인딩할 때 사용
- get - 컴포넌트 내에서 알맞은 의존성을 주입
적용하기✏️
- 모듈 생성하기
- MVVM을 사용하는 앱을 위해서 koin에서는 viewModel 라이브러리를 제공한다
class PlaceSearchViewModel(private val repository : PlaceSearchRepository) : BaseViewModel() {
...
}
- 뷰모델이 생성자의 인자로 repository를 받는 형태일 때 아래와 같이 모듈을 정의하면 된다
ViewModelAppModule.kt
val viewModelAppModule = module {
viewModel { HomeViewModel(get()) }
viewModel { PlaceSearchViewModel(get()) }
viewModel { SignInViewModel(get()) }
viewModel { SignUpViewModel(get()) }
}
- 이렇게 모듈을 생성하면 koin 모듈이 각 뷰모델에 맞는 repository 객체를 생성해서 주입해준다
EarlyBuddyApplication.kt
override fun onCreate() {
super.onCreate()
instance = this
globalApplication = this
startKoin {
androidContext(this@EarlyBuddyApplication)
modules(listOf(
remoteDataAppModule,
repositoryAppModule,
viewModelAppModule
))
}
}
- 생성한 모듈은 Application 레벨의 startKoin 안의 모듈 리스트에 추가해야한다
override val viewModel : PlaceSearchViewModel by viewModel()
- 이제 activity에서 by viewModel() 태그를 이용해 viewModel을 생성해 사용하면 된다!
'Android' 카테고리의 다른 글
[Android] 어플리케이션 기본 항목 - 4대 컴포넌트, App Manifest (0) | 2020.06.23 |
---|---|
[Android & kotlin] AAC(Android Architecture Components) - Room (0) | 2020.06.22 |
[Android & kotlin] AAC(Android Architecture Components) - ViewModel (0) | 2020.06.04 |
[디자인패턴] MVVM 패턴 (BaseActivity, BaseViewModel 사용하기) (0) | 2020.05.03 |
[디자인패턴] MVVM패턴 (DataBinding) (0) | 2020.03.30 |