Skip to content

컨텍스트 격리 (Context Isolation)

컨텍스트 격리(Context isolation)는 SDK 개발자가 호스트 애플리케이션의 Koin 인스턴스와 충돌 없이 Koin을 사용할 수 있게 해줍니다.

INFO

일반적인 Koin 설정에 대해서는 Koin 시작하기 (Starting Koin)를 참고하세요.

컨텍스트 격리를 사용하는 경우

  • SDK/라이브러리 개발 - 라이브러리 내부에서 Koin을 사용하는 경우
  • 충돌 방지 - 호스트 앱 또한 Koin을 사용하고 있을 수 있는 경우
  • 캡슐화 - DI 컨테이너를 비공개(private)로 유지하고 싶은 경우

격리된 컨텍스트 생성하기

GlobalContext에 등록되는 startKoin 대신, koinApplication을 사용하세요:

kotlin
// SDK를 위한 격리된 Koin 컨텍스트
object MySdkKoinContext {

    private val koinApp = koinApplication {
        modules(sdkModule)
    }

    val koin = koinApp.koin
}

val sdkModule = module {
    single<SdkService>()
    single<SdkRepository>()
}

커스텀 KoinComponent

격리된 컨텍스트를 사용하는 커스텀 KoinComponent를 생성합니다:

kotlin
internal interface SdkKoinComponent : KoinComponent {
    // 격리된 컨텍스트를 사용하도록 오버라이드
    override fun getKoin(): Koin = MySdkKoinContext.koin
}

// SDK 클래스에서의 사용 예시
class MySdkClass : SdkKoinComponent {
    private val service: SdkService by inject()  // 격리된 컨텍스트를 사용합니다.
}

격리된 컨텍스트 테스트하기

테스트에서 격리된 컨텍스트를 사용하려면 getKoin()을 오버라이드하세요:

kotlin
class SdkTest : KoinTest {
    override fun getKoin(): Koin = MySdkKoinContext.koin

    @Before
    fun setUp() {
        val testModule = module {
            single<SdkService> { MockSdkService() }
        }
        koin.loadModules(listOf(testModule))
    }

    @After
    fun tearDown() {
        koin.unloadModules(listOf(testModule))
    }
}

함께 보기