Koin (1편)
코인이란?
코틀린 개발자를 위한 실용적인 경량 종속성 주입 프레임 워크이다.
코인은 도메인 특화 언어인 DSL(Domain Specific Language) 이다.
Koin DSL
applicationContext : Koin 모듈 생성
factory : 매번 inject 할때마다 인스턴스를 생성
single : 싱글톤으로 생성
bind : 종속시킬 class 나 interface를 주입
get : 컴포넌트내에 알맞은 의존성 주입
의존성 주입을 하기 위한 라이브러리는 대거2 도 있지만 코인은 좀 더 사용하기 쉽고 가볍게 만들어 졌기 때문에 러닝커브가 낮다고 할 수 있다.
우선 코인을 사용하기 위해 앱 모듈 단에서 dependency를 추가 해준다.
dependencies {
//현재 최신버전인 1.0.2 버전으로 사용하였다.
implementation "org.koin:koin-android:1.0.2"
}
다음 예제 코드를 보자.
class TestApplication : Application() { //Application 클래스에서 모듈과 startKoin을 호출 해준다.
private val goodsModule = module {
factory { GoodsData() } //상품데이터 생성
single { GoodsServiceImpl(get()) as GoodsService }
//GoodsService는 싱글톤으로 생성 되고 get() 은 컴포넌트내에 알맞은 의존성 주입을 해준다.
//get() 은 GoodsData 라고 생각 하면 된다.
factory {
//FactoryData 가 생성 될 때마다 변경되는 값을 넣기 위해 현재시간(Long 타입)을 사용
return@factory FactoryData(Calendar.getInstance().timeInMillis)
}
}
override fun onCreate() {
super.onCreate()
startKoin(this, listOf(goodsModule)) //코인 시작!! listOf 에는 다른 모듈도 정의 한다면 뒤에 더 붙여서 사용
}
}
//FactoryData 데이터 클래스
data class FactoryData(val timeInMillis: Long = 0L)
//GoodsData 데이터 클래스
data class GoodsData(var name : String = "청바지", var price : Long = 30000)
interface GoodsService {
fun getGoodsInfo(): String
}
class GoodsServiceImpl(private val goodsData: GoodsData) : GoodsService {
override fun getGoodsInfo(): String {
//기본적으로 생성 되는 goodsData 정보는 상품명 청바지 , 가격 30000
return "상품명 : " + goodsData.name + " 가격 : " + goodsData.price
}
}
class MainActivity : AppCompatActivity() {
private val goodsService: GoodsService by inject() //by inject() 를 사용해서 GoodsService 주입
private val goodsData: GoodsData by inject() //by inject() 를 사용해서 GoodsData 주입
private val factoryData: FactoryData by inject() //by inject() 를 사용해서 FactoryData 주입
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
Koin 사용 방법
- Application 부분에서 모듈 정의를 해주고 Application onCreate 시점에서 Startkoin을 호출 해주면서 사용 할 module 을 정의해준다.
- module을 정의 할 때 데이터를 어떤 방식으로 생성할지 따로 정의를 해준다
ex) factory , single , bind, get - 실제 사용 되는 부분에서 주입 하기 위해 by inject() 를 통해 주입한다.