오늘도 더 나은 코드를 작성하였습니까?

Koin Modules 본문

Koin

Koin Modules

hik14 2022. 7. 28. 17:01

모듈이란?  What is a module?

코인 모듈은 definition를 모으는 "공간"입니다.  module{ ... }로 선언

val myModule = module {
    // Your definitions ...
}

여러 모듈 사용하기  Using several modules

component가 반드시 동일한 모듈에 있을 필요는 없습니다.

모듈은 definition 구성하는 데 도움이 되는 논리적 공간이며 다른 모듈의 정의에 의존할 수 있습니다.

 

definition는 lazy되었다가, component가 요청할 때만 주입됩니다

// ComponentB <- ComponentA
class ComponentA()
class ComponentB(val componentA : ComponentA)

val moduleA = module {
    // Singleton ComponentA
    single { ComponentA() }
}

val moduleB = module {
    // Singleton ComponentB with linked instance ComponentA
    single { ComponentB(get()) }
}

koin은 import 개념이 없습니다. 

koin definition는 lazy

- koin definition는 koin container로 시작되지만 인스턴스화되지는 않습니다.

- instance는 해당 유형에 대한 요청이 완료되었을 때만 생성됩니다.

 

koin container 를 시작할 때 사용된 모듈 목록을 선언

// Start Koin with moduleA & moduleB
startKoin{
    modules(moduleA,moduleB)
}

 

Overriding definition or module  3.1.0

새로운 코인 override 전략을 사용하면 기본적으로 모든 definition를 재정의할 수 있습니다.

모듈에서 더 이상 override = true를 지정할 필요가 없습니다.

매핑이 동일한 서로 다른 모듈에 2개의 정의가 있는 경우 마지막 정의가 현재 정의를 재정의합니다.

val myModuleA = module {
    single<Service> { ServiceImp() }
}
val myModuleB = module {
    single<Service> { TestServiceImp() }
}

startKoin {
    // TestServiceImp will override ServiceImp definition
    modules(myModuleA,myModuleB)
}

allowOverride(false)를 사용하여 Koin 애플리케이션 구성에서 재정의를 허용하지 않도록 지정할 수 있습니다.

 

모듈 공유하기 Sharing Modules

module { } 함수를 사용할 때, Koin은 모든 인스턴스 팩토리를 미리 할당합니다. 모듈을 공유해야 하는 경우 함수를 만들어서 함께 모듈을 반환하는 것을 고려하십시오.

fun sharedModule() = module {
    // Your definitions ...
}

definition를 공유하고 값에 미리 할당된 팩토리를 피할 수 있습니다.

모듈 연결 전략. Linking modules strategies

모듈 간의 definition lazy 되기 때문에 모듈을 사용하여 다른 전략 구현을 구현할 수 있습니다. 모듈별로 구현을 선언합니다.


repository 및 DataSource의 예를 들어 보겠습니다.

repository에는 DataSource가 필요하며 데이터 소스는 로컬 또는 원격의 두 가지 방법으로 구현할 수 있습니다.

class Repository(val datasource : Datasource)

interface Datasource

class LocalDatasource() : Datasource
class RemoteDatasource() : Datasource

component를 3개의 모듈로 선언할 수 있습니다. Repository 및 Datasource 구현당 하나씩

val repositoryModule = module {
    single { Repository(get()) }
}

val localDatasourceModule = module {
    single<Datasource> { LocalDatasource() }
}

val remoteDatasourceModule = module {
    single<Datasource> { RemoteDatasource() }
}

올바른 모듈 조합으로 Koin을 시작하기만 하면 됩니다.

// Load Repository + Local Datasource definitions
startKoin {
    modules(repositoryModule,localDatasourceModule)
}

// Load Repository + Remote Datasource definitions
startKoin {
    modules(repositoryModule,remoteDatasourceModule)
}

Module Includes(since 3.2 이상)

새로운 function Include()는 Module 클래스에서 사용할 수 있으며,

이를 통해 조직화되고 구조화된 방식으로 다른 모듈을 포함하여 모듈을 구성할 수 있습니다.

 

Include()의 두 가지 주요 사용 사례

- 큰 모듈을 더 작고 집중적인 모듈로 나눕니다.
- 모듈화된 프로젝트에서는 모듈 가시성을 보다 세밀하게 제어할 수 있습니다.

// `:feature` module
val childModule1 = module {
    /* Other definitions here. */
}
val childModule2 = module {
    /* Other definitions here. */
}
val parentModule = module {
    includes(childModule1, childModule2)
}

// `:app` module
startKoin { modules(parentModule) }

모든 모듈을 명시적으로 설정할 필요는 없습니다.

 parentModule을 포함하면 안에 포함에 선언된 모든 모듈이 자동으로 로드됩니다(childModule1 및 childModule2)

 즉, Koin은 parentModule, childModule1 및 childModule2를 효과적으로 로드하고 있습니다.

 

관찰해야 할 중요한 세부 사항은 포함을 사용하여 내부 및 개인 모듈도 추가할 수 있다는 것입니다.

모듈화된 프로젝트에서 무엇을 노출할지에 대한 유연성을 제공합니다.

 

마지막으로 여러 개의 중첩 또는 중복 모듈을 포함할 수 있으며 Koin은 포함된 모든 모듈을 병합하여 중복을 제거합니다.

// :feature module
val dataModule = module {
    /* Other definitions here. */
}
val domainModule = module {
    /* Other definitions here. */
}
val featureModule1 = module {
    includes(domainModule, dataModule)
}
val featureModule2 = module {
    includes(domainModule, dataModule)
}

// `:app` module
startKoin { modules(featureModule1, featureModule2) }

모든 모듈은 dataModule, domainModule, featureModule1, featureModule2와 같이 한 번만 포함됩니다.

'Koin' 카테고리의 다른 글

Koin (Scopes)  (0) 2022.07.28
Koin (Passing Parameters - Injected Parameters)  (0) 2022.07.28
Koin Component  (0) 2022.07.28
Koin Definitions  (0) 2022.07.28
Koin이란?  (0) 2022.07.27