Skip to content

Koin 시작하기

Koin은 DSL이자, 경량 컨테이너이며, 실용적인 API입니다. Koin 모듈 내에 정의를 선언하면, Koin 컨테이너를 시작할 준비가 된 것입니다.

startKoin 함수

startKoin 함수는 Koin 컨테이너를 실행하는 주요 진입점입니다. 이 함수는 실행할 Koin 모듈 목록을 필요로 합니다. 모듈이 로드되고 정의가 Koin 컨테이너에 의해 해결될 준비가 됩니다.

Koin 시작하기

kotlin
// start a KoinApplication in Global context
startKoin {
    // declare used modules
    modules(coffeeAppModule)
}

startKoin이 호출되면, Koin은 모든 모듈과 정의를 읽습니다. 그러면 Koin은 필요한 인스턴스를 가져오기 위한 모든 get() 또는 by inject() 호출에 대비할 준비가 됩니다.

Koin 컨테이너는 다음과 같은 몇 가지 옵션을 가질 수 있습니다.

  • logger - 로깅을 활성화합니다. - <<logging.adoc#_logging,logging>> 섹션 참조
  • properties(), fileProperties( ) 또는 environmentProperties( ) - 환경, koin.properties 파일, 추가 프로퍼티 등에서 프로퍼티를 로드합니다. - <<properties.adoc#_lproperties,properties>> 섹션 참조

INFO

startKoin은 두 번 이상 호출될 수 없습니다. 여러 지점에서 모듈을 로드해야 하는 경우, loadKoinModules 함수를 사용하세요.

시작 과정의 내부 동작 - Koin 인스턴스

Koin을 시작할 때, Koin 컨테이너 구성 인스턴스를 나타내는 KoinApplication 인스턴스를 생성합니다. 일단 실행되면, 모듈과 옵션의 결과로 Koin 인스턴스를 생성하게 됩니다. 이 Koin 인스턴스는 이후 GlobalContext에 의해 유지되며, 모든 KoinComponent 클래스에서 사용될 수 있습니다.

GlobalContext는 Koin의 기본 JVM 컨텍스트 전략입니다. startKoin에 의해 호출되고 GlobalContext에 등록됩니다. 이는 Koin 멀티플랫폼 관점에서 다른 종류의 컨텍스트를 등록할 수 있게 해줍니다.

startKoin 이후 모듈 로드

startKoin 함수를 두 번 이상 호출할 수는 없습니다. 하지만 loadKoinModules() 함수를 직접 사용할 수 있습니다.

이 함수는 Koin을 사용하려는 SDK 개발자에게 유용합니다. 왜냐하면 그들은 starKoin() 함수를 사용할 필요 없이 라이브러리 시작 시 loadKoinModules를 사용하기만 하면 되기 때문입니다.

kotlin
loadKoinModules(module1,module2 ...)

모듈 언로드

주어진 함수를 사용하여 여러 정의를 언로드하고 해당 인스턴스들을 해제하는 것도 가능합니다.

kotlin
unloadKoinModules(module1,module2 ...)

Koin 중지 - 모든 리소스 닫기

모든 Koin 리소스를 닫고 인스턴스와 정의를 삭제할 수 있습니다. 이를 위해 어디서든 stopKoin() 함수를 사용하여 Koin GlobalContext를 중지할 수 있습니다. 또는 KoinApplication 인스턴스에서 단순히 close()를 호출하기만 하면 됩니다.

로깅

Koin은 모든 Koin 활동(할당, 조회 등)을 로깅하는 간단한 로깅 API를 제공합니다. 이 로깅 API는 아래 클래스로 표현됩니다.

Koin 로거

kotlin
abstract class Logger(var level: Level = Level.INFO) {

    abstract fun log(level: Level, msg: MESSAGE)

    fun debug(msg: MESSAGE) {
        log(Level.DEBUG, msg)
    }

    fun info(msg: MESSAGE) {
        log(Level.INFO, msg)
    }

    fun error(msg: MESSAGE) {
        log(Level.ERROR, msg)
    }
}

Koin은 대상 플랫폼에 따라 몇 가지 로깅 구현을 제공합니다.

  • PrintLogger - 콘솔에 직접 로깅합니다 (koin-core에 포함됨)
  • EmptyLogger - 아무것도 로깅하지 않습니다 (koin-core에 포함됨)
  • SLF4JLogger - SLF4J를 사용하여 로깅합니다. Ktor 및 Spark에서 사용됩니다 (koin-logger-slf4j 프로젝트)
  • AndroidLogger - Android 로거에 로깅합니다 (koin-android에 포함됨)

시작 시 로깅 설정

기본적으로 Koin은 EmptyLogger를 사용합니다. 다음과 같이 PrintLogger를 직접 사용할 수 있습니다.

kotlin
startKoin {
    logger(LEVEL.INFO)
}

프로퍼티 로드

시작 시 다음과 같은 여러 종류의 프로퍼티를 로드할 수 있습니다.

  • 환경 프로퍼티 - 시스템 프로퍼티를 로드합니다.
  • koin.properties 파일 - /src/main/resources/koin.properties 파일에서 프로퍼티를 로드합니다.
  • "추가" 시작 프로퍼티 - startKoin 함수에 전달되는 값의 맵입니다.

모듈에서 프로퍼티 읽기

Koin 시작 시 프로퍼티를 로드해야 합니다.

kotlin
startKoin {
    // Load properties from the default location
    // (i.e. `/src/main/resources/koin.properties`)
    fileProperties()
}

Koin 모듈에서는 키를 사용하여 프로퍼티를 가져올 수 있습니다.

/src/main/resources/koin.properties 파일에서

java
// Key - value
server_url=http://service_url

getProperty 함수로 로드하기만 하면 됩니다.

kotlin
val myModule = module {

    // use the "server_url" key to retrieve its value
    single { MyService(getProperty("server_url")) }
}