[Android] Koin ์ฌ์ฉํ๊ธฐ
์ ๋ฐ์ดํธ:
๐ฉโ๐ป Koin ์ฌ์ฉํ๊ธฐ ๐
๊ณต๋ถํด์ผ์ง ๋ฐฑ๋ง๋ฒ์ ๋ง์ ๋จน์ ๊ฒ ๊ฐ์๋ฐ, ์ด์ ์์ผ ๋ค์ฌ๋ค๋ณด๋ DI (Dependency Injection)
Koin์ ์ฝํ๋ฆฐ ๊ฐ๋ฐ์๋ฅผ ์ํด ๊ฐ๋ฐ๋ ์ค์ฉ์ ์ด๊ณ ๊ฐ๋ฒผ์ด ์์กด์ฑ ์ฃผ์
ํ๋ ์์ํฌ๋ค. ์์กด์ฑ ์ฃผ์
ํ๋ ์์ํฌ๋ ๋ํ์ ์ผ๋ก Dagger
, Hilt
, Koin
๋ฑ์ด ์๋๋ฐ, Koin
์ ๊ฐ์ฅ ๋ฎ์ ๋ฌ๋ ์ปค๋ธ๋ฅผ ์๋ํ์ฌ ์์กด์ฑ ์ฃผ์
์ ์
๋ฌธํ๊ธฐ ์ข์ ํ๋ ์์ํฌ!
์์กด์ฑ ์ฃผ์
์ ํ์ํ ๊ฐ์ฒด๋ฅผ ์ง์ ์์ฑํ์ง ์๊ณ ์ธ๋ถ๋ก๋ถํฐ ๊ฐ์ฒด๋ฅผ ๋๊ฒจ ๋ฐ์์ ์ฌ์ฉํ๋๊ฒ์ ๋ปํ๋ค ์ด๋ค Activity๋ Fragment์์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋์ง์ ๋ฐ๋ผ Context๊ฐ ๊ณ์ ๋ฐ๋๊ธฐ ๋๋ฌธ์ ๊ฐ์ ํด๋์ค ํ์
๊ฐ์ฒด์์๋ ๋ค๋ฅด๊ฒ ๋์ํ ์ ์๋ค. ์ธ๋ถ์์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์ด ์์ฑ๋ ๊ฐ์ฒด๋ฅผ Activity๋ Fragment์ ์ฃผ์
๋ฐ์ ์ฌ์ฉํ๋ฉด Context์ ์ํฅ์ ๋ฐ์ง ์๊ณ ๋ ๊ณตํต์ผ๋ก ์ฌ์ฌ์ฉํ ์ ์๋ ๊ฐ์ฒด๋ฅผ ๊ตฌํํ๊ฒ ๋๋ค.
์ค๋ช
๋ง์ผ๋ก๋ ์ด๋ค ์์ผ๋ก ์ฌ์ฉํด์ผํ๋ ๊ฑด์ง ๊ฐ์ด ์ ์ค์ง ์์์ ์ ๋ฆฌ๋ ๋ธ๋ก๊ทธ๋ค์ ํตํด์ Koin์ ์ ์ฉํ๋ ๊ณผ์ ์ ๋ฐ๋ผํด๋ดค๋ค.
ย
๐ DI ์ฌ์ฉ์ ์ด์
- ์ฝ๋์ ๊ฐ๋ ์ฑ๊ณผ ์ฌ์ฌ์ฉ์ฑ์ ๋์ฌ์ค๋ค.
- ๋จ์ ํ ์คํธ ์ฉ์ด
- ๊ฐ์ฒด ๊ฐ์ ์์กด(์ข ์) ๊ด๊ณ๋ฅผ ์ง์ ์ค์ ํ ์ ์์
- ๊ฐ์ฒด ๊ฐ์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถฐ ์ค
ย
๐ Koin ์ฌ์ฉ ์ ์์๋ฌ์ผ ํ ํค์๋
- module : ์ฃผ์ ๋ฐ๊ณ ์ ํ๋ ๊ฐ์ฒด๋ฅผ ๋ชจ๋๋ก ๋ง๋ค์ด ์ ์ธ
- single : ์ฑ์ด ์คํ๋๋ ๋์ ๊ณ์ ์ ์ง๋๋ ์ฑ๊ธํค ๊ฐ์ฒด๋ฅผ ์์ฑ
- factory : ์์ฒญํ ๋๋ง๋ค ๋งค๋ฒ ์๋ก์ด ๊ฐ์ฒด ์์ฑ
- get() : ์ปดํฌ๋ํธ ๋ด์์ ์๋ง์ ์์กด์ฑ์ ์ฃผ์
๋ฐ์
ย
๐ dependency ์ถ๊ฐ
dependencies {
implementation 'org.koin:koin-androidx-viewmodel:2.1.5'
}
ย
๐ ๋ชจ๋ ์ ์ธ
1. ์ํ ํด๋์ค ์์ฑ
class SampleRepository() {
val sampleData = "Sample Repository"
}
class SampleController(val repository: SampleRepository) {
fun printSampleData() {
Log.d("Print sample data", repository.sampleData)
}
}
class SampleViewModel : ViewModel() {
private var _isLoading = MutableLiveData<Boolean>()
val isLoading: LiveData<Boolean> = _isLoading
}
ย
2. ๋ชจ๋๋ก ์ ์ธํ์ฌ ๋ณ์์ ์ ์ฅ
val appModule = module {
single { SampleRepository() }
factory { SampleController(get()) }
}
val viewModelModule = module {
viewModel { SampleViewModel() }
}
์์์ ์ธ๊ธํ๋ Koin์์ ์์๋ฌ์ผ ํ ํค์๋๋ฅผ ๋์ ํด๋ณด์๋ฉด,
single
์ปจํ ์ด๋ ๋ด์์ ๋จ ํ๋ฒ๋ง ์์ฑ๋๊ณfactory
์ปจํ ์ด๋ ๋ด์์ ์์ฒญ ์์ ๋ง๋ค ์๋ก์ด ๊ฐ์ฒด ์์ฑget()
์ปจํ ์ด๋ ๋ด์์ ์๋ง์ ์์กด์ฑ์ ์ฃผ์viewModel
ViewModel์ ๊ฒฝ์ฐ๋viewModel
ํค์๋๋ก ์ ์ธ
ย
๐ ๋ชจ๋ ๋ฑ๋ก
class InquiryApplication : Application() {
override fun onCreate() {
super.onCreate()
startKoin {
androidLogger()
androidContext(this@InquiryApplication)
modules(appModule)
modules(viewModelModule)
}
}
}
startKoin
์ ํธ์ถํด์ ์ ์ธํ ๋ชจ๋ ๋ณ์๋ฅผ ๋๊ฒจ์ค๋ค.androidLogger()
: AndroidLogger๋ฅผ Koin logger๋ก ์ฌ์ฉandroidContext()
: ํด๋น ์๋๋ก์ด๋ context ์ฌ์ฉmodules()
: ์ฌ์ฉํ ๋ชจ๋ ๋ฑ๋ก- Application ํด๋์ค ์์ฑ ํ ๊ผญ
AndroidManifest.xml
์ ๋ฑ๋กํด์ผ ํจ!
<application
android:name=".InquiryApplication"
...
}
ย
๐ ์์กด์ฑ ์ฃผ์
inject()
ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ์์กด์ฑ์ ์ฃผ์- ViewModel์ ๊ฒฝ์ฐ
viewModel()
์ฌ์ฉ - ์ฌ์ฉํ๊ณ ์ ํ๋ Activity ํด๋์ค์์ ์ฃผ์ ํ๋ฉด ๋๋ค.
class SampleActivity : AppCompatActivity() {
val controller: SampleController by inject()
val viewModel: SampleViewModel by viewModel()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate()
}
}
ย
ย
[์ฐธ๊ณ ]
https://salix97.tistory.com/265
https://velog.io/@hoyaho/Koin
https://spoqa.github.io/2020/11/02/android-dependency-injection-with-koin.html