[Android] Koin

Jay·2020년 12월 16일
0

Android

목록 보기
2/39
post-thumbnail

Dependency Injection

  • DI (Dependency Injection)는 의존성 주입을 의미합니다.
  • 의존성이란 클래스간 객체로 참조가 되는 경우를 말합니다.
  • MVVM 모델에서 모듈 간 독립성과 TDD가 용이한 구조로 만들기 위해서 DI를 사용하기도 합니다.(물론 di가 훨씬 먼저 나온 개념입니다.)

DI

SessionData.kt

class SessionData{
	val sessionId : String
    
    constructor() {
    	this.sessionId = "abcd"
    }
}

ExampleData.kt

class ExampleData{
	var value : Int = 0
    val sessionData : SessionData
    
    init{
    	sessionData = SessionData()
    }
}
  • 위처럼 ExampleData 클래스는 내부에서 SessionData 클래스를 참조하고 있습니다.
  • ExampleData 클래스는 SessionData클래스에 의존성을 갖고 있습니다.
  • 이러한 의존성은 SessionData클래스 생성자 (constructor)가 바뀌게 된다면 참조하고 있는 클래스(ExampleData)는 매번 변경되어야 합니다.
  • DI를 통해 이와 같은 의존성을 해결함으로써 종속된 코드와 결합도를 낮추면서클래스의 유연성과 확장성을 동시에 확보할 수 있습니다.
    즉, SessionData가 수정 됨에 따라 ExampleData가 영향을 받지 않도록.혹은 그 영향을 최소화 시키는 것.

아주 간단하게 DI의 개념에 대해서 이야기 하였고 이젠 koin을 알아보자.


Koin

  • DI 라이브러리로 Android에서 DI를 사용하기 위한 기본적인 기능을 손쉽게 제공해준다.

Koin DSL

DSL(Domain Specific Language)로 번역을 하자면 도메인 특화 언어로 위키 피디아에서는 "특정한 도메인을 적용하는데 특화된 언어"라고 한다.

  • applicationContext: Koin 모듈 생성
  • module : Koin 모듈 정의 블록
  • factory : inject 주입 시점에 해당 객체를 생성한다.(매번 inject할때마다)
  • single : Singleton형태로 객체를 주입한다.
  • get : 주입해야 하는 컴포넌트들의 의존성을 알아서 처리해준다.
  • bind : 종속시킨 class나 interface를 주입해준다.
  • KoinComponent and so on.

Ex. 컴포넌트 주입

이런식으로 모듈을 만들어서 주입을 해준다면.

var repositoryModule = module{
	single{SampleRepoImpl(get())}
}
  • get() <위에서 본 그 get>
    : get() 생성에 필요한 파라미터를 찾아서 주입한다.
    : SampleRepoImpl(필요 컴포넌트) <- 이런 구조. 아래의 코드가 실제 주입되는 방식이다.
class SampleRepoImpl(private val sampleRemoteDataSource : SampleRemoteDataSource) : SampleRepo{
}

사용하는 법

  1. 사용하고자 하는 activity, fragment에서
val vm : SampleViewModel by inject()

위처럼 사용하여 주입받아서 뷰모델도 쓸 수 있다.

  • koin을 이용한다면 AAC ViewModel을 koin viewmodel로 변경하여 의존성 주입을 할 수 있다.

객체를 주입하는 방법

factory{
	ExampleData()
}
  • 주입할 때마다 ExampleData 객체가 생성된다.

👀 이걸 사용하는 방법은?

val data by inject<ExampleData>()

inject로 생성자 없이 주입받아 사용할 수 있다.

이 외에 KoinComponent

  • Activity, Fragment가 아닌 클래스에서 주입받기 위해서 KoinComponent를 상속 받는다.

예를 들면, ViewModel..?

Class TvViewModel : ViewModel () {
	KoinComponent {
	 private val _tvLiveData: MutableLiveData<TvInfoResult> = MutableLiveData() //PrintService를 생성자 없이 inject로 주입힌다.
	 
     val tvRepoImpl: TvRepoImpl by inject()
	 val tvData: LiveData<TvInfoResult>
		 get() = _tvLiveData

	fun requestData() {
    tvRepoImpl.getPopularTv(apikey, language, page)
    .subscribe()………{
    	result.foreach{ it ->
		 tvData = it
         }
         _tvLiveData.value = tvData //받아온 데이터 LiveData로 포장
 	}
 }

위와 같은 형태로 사용할 수 있다. (그냥 ViewModel()옆에 KoinComponent로 implementation해도 된다.

물론, 뷰모델도 생성자 주입을 할 수 있다.

class SampleViewModel(private val repo : SampleRepoImpl) : BaseViewModel(){}

요렇게.

📄 참고

profile
developer

0개의 댓글