Android/Dependency Injection

[Koin] 5. single과 factory를 이용한 의존성 주입 비교

반응형

예제 링크 :  https://github.com/seyoungcho2/KoinExample

예제 브랜치명 : example/example5 *브랜치 필수 확인

 

의존성 제공 메서드 single과 factory

single은 한 번만 객체를 생성하고 factory는 호출 될때마다 객체를 생성한다.

 

다음과 같은 Student("student-kim")은 single로 제공되고 Student("student-cho")는 factory로 제공되는 상황을 가정해보자.

module {
    single(named("kim")) { Student("student-kim") }
    factory(named("cho")) { Student("student-cho") }
}

이때 다음과 같이 각각에 대한 의존성을 두 번씩 주입했다고 해보자

val studentKim1 : Student by inject(named("kim"))
val studentKim2 : Student by inject(named("kim"))

val studentCho1 : Student by inject(named("cho"))
val studentCho2 : Student by inject(named("cho"))

 

그러면 <그림1>과 같이 주입이 일어난다.

 

그림1. single과 factory의 차이

single로 제공되는 kim은 한번만 생성되어 주입되지만 factory로 제공되는 cho는 호출될 때마다 생성되어 주입 된다.

 

따라서 Kotlin 동등성 비교 연산자(두 객체가 동일한지 여부를 확인)를 이용하여 확인하면

studentKim1 === studentKim2 // true
studentCho1 === studentCho2 // false

kim은 true가 나오며 cho는 false 가 나오게 된다.

 

 

전체 코드 정리

전체 코드는 다음과 같다.

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

        startKoin {
            androidContext(this@MainActivity)
            modules(
                module {
                    single(named("kim")) { Student("student-kim") }
                    factory(named("cho")) { Student("student-cho") }
                }
            )
        }

        val studentKim1 : Student by inject(named("kim"))
        val studentKim2 : Student by inject(named("kim"))

        val studentCho1 : Student by inject(named("cho"))
        val studentCho2 : Student by inject(named("cho"))

        findViewById<TextView>(R.id.textViewTeacher).text = (studentKim1 === studentKim2).toString() // true
        findViewById<TextView>(R.id.textViewStudent).text = (studentCho1 === studentCho2).toString() // false
    }
}

이 코드를 실행할 경우 다음과 같은 결과 화면이 나온다.

그림2. 결과 화면

반응형

 

이 글의 저작권은 Kotlin World 에 있습니다. 글, 이미지 무단 재배포 및 변경을 금지합니다.