# ๋ฉํฐ๋ฐ์ธ๋ฉ `@IntoSet` `@IntoMap` `@Multibinds`
๋ฉํฐ๋ฐ์ธ๋ฉ์ ์ฌ๋ฌ ๋ฐ์ธ๋ฉ์ ํ๋์ ์ปฌ๋ ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๊ตฌ์กฐ๋ค. Set, Map ์ปฌ๋ ์ ์ ์ง์ํ๋ฉฐ ์ค๋ณต๋ฐ์ธ๋ฉ์ด๋์ ๊ฒฐ์ด ์ข ๋ค๋ฅด๋ค๊ณ ๋ณผ ์ ์์ ๊ฒ ๊ฐ๋ค.
Set์ ์ด์ฉํ ๋ฐฉ์์ ๊ธฐ์กด @Providesํ๋ ๋ฐ์ธ๋ฉ์ `@IntoSet`์ ๋ฌ์์ฃผ๋ฉด ๋๋ค. ๊ทธ๋ ๊ฒ ํ๋ฉด ์ปดํ์ผ ํ์์์ Set์์ @IntoSet์ด ์ ์ธ๋ ๋ฐ์ธ๋ฉ์ ๋ฌถ์ด์ ๊ฐ๊ณ ์๊ฒ ๋๋ค. ๊ทผ๋ฐ ์ปฌ๋ ์ ์ผ๋ก ๋ฐ์ธ๋ฉ์ ๊ด๋ฆฌํ๋ฉด ๋ฌธ์ ๊ฐ ํ๋ ์๊ธด๋ค.
๋จ๋ ๋ฐ์ธ๋ฉ์ผ ๋๋ EntryPoint์์ @Injectํ ๋ ์์์ ๊ฐ์ ธ๊ฐ๋๋ฐ, ๋ฐํํ์ ์ด Set<T>์ผ๋ก ๊ฐ์ธ์ ธ์์ด์ ๊ทธ๋ฅ @Injectํ๋ฉด MissingBinding์ ์ค๋ฅ๋ก ๋ด๋ฟ๊ฒ ๋๋ค.
๋จ๋ ๋ฐ์ธ๋ฉ์ด Set<T>์ผ๋ก ๋์ด์๋ค๋ฉด @IntoSet๋ง๊ณ `@ElementsIntoSet`์ ๋ฌ์์ค์ผ๋๋ค. ๊ทธ๋ฌ๋ฉด ๋จ๋ ๋ฐ์ธ๋ฉ ๋ Set์ ์์๋ค์ด Set ๋ฉํฐ ๋ฐ์ธ๋ฉ ๋ผ์ ๋ค์ด์จ๋ค.
@Module
@InstallIn(SingletonComponent::class)
class MultiBindModule {
@Provides
@IntoSet
fun provideString(): String{
return "test"
}
}
// ์ฌ์ฉ์ ์๋์ฒ๋ผ Set์ผ๋ก
@Inject
lateinit var str: Set<String>
Set์ ๋ฐํํ๋ ๋ฐ์ธ๋ฉ์ ์ด ๊ฑด ์๋์ ๊ฐ๋ค.
@Module
@InstallIn(SingletonComponent::class)
class MultiBindModule {
@Provides
@IntoSet
fun provideString(): String {
return "test"
}
@Provides
@ElementsIntoSet
fun provideStrings(): Set<String> {
return setOf("a", "b", "c")
}
}
๊ทธ๋ผ ์์์ str์ Set์ ๋ฐ์์ค๋๋ฐ, ๊ฒฐ๊ณผ๊ฐ ์ด๋ป๊ฒ ๋์ฌ๊น?
๋ค ๋ด๊ฒจ์ ๋ค์ด์จ๋ค. Set ๋ง๊ณ Map์ผ๋ก๋ ๋ฉํฐ๋ฐ์ธ๋ฉ์ด ๊ฐ๋ฅํ๋ค.
Map์ ๊ธฐ๋ณธ์ ์ผ๋ก Key - Value ํ์์ด๋ผ ํค๋ฅผ ์ง์ ํด์ค์ผํ๋๋ฐ, String, Int, Long, Class๋ก ํค๋ฅผ ์ง์ ํด์ค ์ ์๋ค. ์ฌ์ฉ๋ฐฉ๋ฒ์ Set๊ณผ ๋น์ทํ๋ฐ, @IntoMap๊ณผ @"ํ์ "Key("ํค ๊ฐ")์ ์ง์ ํด์ฃผ๋ฉด ๋๋ค.
@Provides
@IntoMap @IntKey(1)
fun provideName(): String{
return "one"
}
@Provides
@IntoMap @ClassKey(Test::class)
fun provideNameOfClass(): String{
return "Test Value"
}
Testํด๋์ค๋ฅผ ํค๋ก ์ด๊ฑด๋ฐ ํค ํ์ ์ด `Class<*>`๊ฐ ๋๋ค. Map์ ์ฌ์ฉํ ๋ฉํฐ๋ฐ์ธ๋ฉ์ ํค๊ฐ์ด ๊ฐ์ฅ ์ค์ํด์ ์กฐ์ฌํด์ผ๋๋ค.
@Inject
lateinit var mapInt: Map<Int, String>
@Inject
lateinit var mapClass: Map<Class<*>, String>
mapClass ๊ฐ์ `mapClass[Test::class.java]`๋ก ๊บผ๋ด์ด๋ค.
์ง์ ๋ ํ์ ๋ง๊ณ ๋ ํค๋ฅผ ์ค์ ํ ์ ์๋ค. `@MapKey`๋ฅผ ์ฌ์ฉํ ๋ฐฉ์์ธ๋ฐ ํค๊ฐ ๋ enum class ๊ฐ์ ๊ฑธ annotation class๋ก ์ปค์คํ ํค ์ด๋ ธํ ์ด์ ์ ์ธํด์ฃผ๊ณ , @MapKey๋ฅผ ๋ถ์ฌ์ ์ฐ๋ฉด๋๋ค.
@MapKey
annotation class CustomMapKey(val value: Keys)
enum class Keys {
ONE,
TWO,
THREE
}
// ๋ชจ๋์์๋ ์๋ ์ฒ๋ผ
@Provides
@IntoMap
@CustomMapKey(Keys.ONE)
fun provideCK(): String{
return "CK"
}
Inject ๋ถ๋ถ์์๋ Enum ํด๋์ค๋ฅผ Key์ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
`@Multibinds`๋ ๋ฐ์ธ๋ฉ ๋์ง ์๋์ง ๋ชจ๋ฅด๋ ์ํ์ด๊ฑฐ๋ ๋น์ปฌ๋ ์ ์ด ํ์ํ ๋ ์ฌ์ฉํ๋ฉด ๋๋ค.
๋์์ด ๋๋ค๋ฉด ๋๊ธ์ด๋ ๊ณต๊ฐ ๋ฒํผ ํ ๋ฒ์ฉ ๋๋ฅด๊ณ ๊ฐ์ฃผ์ธ์!
'Android ๐ฅ๏ธ > DI๐' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
@Provides ์ @Binds (0) | 2024.08.02 |
---|---|
Android 15 ๋์ ํ๋ก์ ํธ ๊ตฌ์กฐ ๋ณํ... ๊ทธ๋ฆฌ๊ณ toml์์๋ณด๊ธฐ + Hilt ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ถ๊ฐํ๊ธฐ (0) | 2024.07.16 |
Hilt(2) - ๋ฐ์ธ๋ฉ๊ณผ ์์กด์ฑ ์ฃผ์ (0) | 2024.07.05 |
Hilt(1) (0) | 2024.06.22 |
DI ์ ๋ฌธ - ์ข ์ ํญ๋ชฉ ์ฝ์ (0) | 2024.03.07 |