개발 일기

Koin(DI) 본문

Client/안드로이드

Koin(DI)

이건욱

koin 이란 kotlin 개발자를 위한 경량화된 dependency injection framework입니다.

 

DI 란?

객체 자체가 아니라 Framework에 의해 객체의 의존성이 주입되는 설계 패턴입니다.

 

  장점

     1) 종속성이 감소합니다.

     2) 재사용성에 증가 

     3) 테스트 코드 작성에 유리

     4) 코드 유지보스에 이점이 있습니다.

 

 

Setting?

// latest stable

koin_version = '2.1.1'

repositories {
	jcenter()    
}

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath "org.koin:koin-gradle-plugin:$koin_version"
    }
}

apply plugin: 'koin'


Core features
// Koin for Kotlin
implementation "org.koin:koin-core:$koin_version"
// Koin extended & experimental features
implementation "org.koin:koin-core-ext:$koin_version"
// Koin for Unit tests
testImplementation "org.koin:koin-test:$koin_version"
// Koin for Java developers
implementation "org.koin:koin-java:$koin_version"


Android
// Koin for Android
implementation "org.koin:koin-android:$koin_version"
// Koin Android Scope features
implementation "org.koin:koin-android-scope:$koin_version"
// Koin Android ViewModel features
implementation "org.koin:koin-android-viewmodel:$koin_version"
// Koin Android Experimental features
implementation "org.koin:koin-android-ext:$koin_version"


AndroidX
// Koin AndroidX Scope features
implementation "org.koin:koin-androidx-scope:$koin_version"
// Koin AndroidX ViewModel features
implementation "org.koin:koin-androidx-viewmodel:$koin_version"
// Koin AndroidX Fragment features
implementation "org.koin:koin-androidx-fragment:$koin_version"
// Koin AndroidX Experimental features
implementation "org.koin:koin-androidx-ext:$koin_version"

 

예시?

 

Application

// Given some classes 
class Controller(val service : BusinessService) 
class BusinessService() 

// just declare it 
val myModule = module { 
  single { Controller(get()) } 
  single { BusinessService() } 
} 
class MyApplication : Application() {
  override fun onCreate(){
    super.onCreate()
    // start Koin!
    startKoin {
      // Android context
      androidContext(this@MyApplication)
      // modules
      modules(myModule)
    }
  } 
} 

 

Activity

val logger : Logger by inject()

override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  setContentView(R.layout.activity_main)
}

 

Activity가 아닌 곳

class HelloApp : KoinComponent {

    // lazy inject dependency
    val helloService: HelloServiceImpl by inject()

    fun sayHello(){
        helloService.sayHello()
    }
}

테스트 작성

class MyTest : KoinTest {

    // Lazy inject property
    val componentA : ComponentA by inject()

    // use it in your tests :)
    @Test
    fun `make a test with Koin`() {
        startKoin { modules(appModule) }

        // use componentA here!
    }
}

 

키워드 설명

 

startKoin { } = KoinApplication 인스턴스 생성 및 등록

modules {} = 사용한 모듈 선언

  - module {} = Koin module 또는 하위 module

     - factory = 의존성 주입이 일어날 때마다 객체 생성

     - single = 싱글톤 인스턴스 제공

androidLogger() = Android Koin 로거 선언

androidContext() = 안드로이드 Context 사용

 

'Client > 안드로이드' 카테고리의 다른 글

android key Hash 구하기  (0) 2020.03.07
Android Realm 사용방법  (0) 2020.03.06
ConstraintLayout  (0) 2020.03.05
임시 UI 상태 저장 및 복원  (0) 2020.03.04
안드로이드 생명주기  (0) 2020.03.03
Comments