티스토리 뷰

의존성 주입 (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을 생성해 사용하면 된다!
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함