์ถ์ฒ
ChatGPT
DI(Dependency Injection) ์ปจํ ์ด๋๋ ๊ฐ์ฒด ๊ฐ์ ์์กด์ฑ์ ๊ด๋ฆฌํ๊ณ ์ฃผ์ ํ์ฌ ์ฝ๋์ ์ ์ฐ์ฑ๊ณผ ์ฌ์ฌ์ฉ์ฑ์ ๋์ด๋ ์ค์ํ ๋๊ตฌ์ด๋ค. ๊ทธ๋ฌ๋ DI ์ปจํ ์ด๋๋ฅผ ์ฌ์ฉํ ๋, ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น ์ ์๋ ๋ช ๊ฐ์ง ์์๊ฐ ์กด์ฌํ๋ค.
DI ์ปจํ ์ด๋ ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น๋ ์์
1. ๋ฐํ์ ์์กด์ฑ ํด์
1. ๋ฌธ์ ์
์ผ๋ถ DI ์ปจํ ์ด๋๋ ์์กด์ฑ ๊ทธ๋ํ๋ฅผ ๋ฐํ์์ ํด์ํ์ฌ ๊ฐ์ฒด๋ฅผ ์ฃผ์ ํ๋ค. ๋ฐํ์ ์์กด์ฑ ํด์์ ๊ฐ์ฒด์ ์์กด์ฑ ํธ๋ฆฌ๋ฅผ ํ์ํ๋ฉด์ ํ์ํ ๋๋ง๋ค ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ธฐ ๋๋ฌธ์, ์ฑ๋ฅ์ ๋ถ์ ์ ์ธ ์ํฅ์ ๋ฏธ์น ์ ์๋ค. ํนํ, ์์กด์ฑ ํธ๋ฆฌ๊ฐ ๊น๊ฑฐ๋ ๋ณต์กํ ๊ฒฝ์ฐ ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ๋๋๋ฌ์ง๋ค.
2. ๊ฐ์ ๋ฐฉ๋ฒ
- ์ปดํ์ผ ํ์ ์์กด์ฑ ํด์: ์ปดํ์ผ ํ์์ ์์กด์ฑ์ ํด์ํ์ฌ ์ฝ๋ ์์ฑ๊ธฐ๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ์ฝ๋ ๋ถ์์ ํตํด ๊ฐ์ฒด ์์ฑ์ ์ต์ ํํ ์ ์๋ DI ์ปจํ ์ด๋(Dagger 2 ๋ฑ)๋ฅผ ์ฌ์ฉํ๋ค.
- ์์กด์ฑ ๊ทธ๋ํ ๋จ์ํ: ์์กด์ฑ ํธ๋ฆฌ๋ฅผ ๋จ์ํํ์ฌ ๋ถํ์ํ ๊ฐ์ฒด ์์ฑ์ ์ค์ด๊ณ , ๊ฐ์ฒด์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๋ช ํํ ์ ์ํ์ฌ ๊ด๋ฆฌํ๋ค.
2. ๊ฐ์ฒด์ ์๋ช ์ฃผ๊ธฐ ๋ฐ ๋ฒ์ ๊ด๋ฆฌ
1. ๋ฌธ์ ์
๋ชจ๋ ๊ฐ์ฒด๋ฅผ ๋งค๋ฒ ์๋ก ์์ฑํ๋ ๊ฒ์ ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น๋ค. ๋ํ, ์ฑ๊ธํค ๊ฐ์ฒด๋ฅผ ๊ณผ๋ํ๊ฒ ์ฌ์ฉํ๊ฑฐ๋ ์๋ชป ๊ด๋ฆฌํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋์๋ ๋ถํ์ํ ๋ฆฌ์์ค ์ ์ ๋ก ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
2. ๊ฐ์ ๋ฐฉ๋ฒ
- ์ ์ ํ ๋ฒ์ ์ฌ์ฉ : ๊ฐ์ฒด์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๋ช ํํ ์ ์ํ๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ์ ์๊ตฌ์ ๋ง๋ ์ ์ ํ ๋ฒ์๋ฅผ ์ค์ ํ๋ค. ์๋ฅผ ๋ค์ด, ์ฑ๊ธํค ๋ฒ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด์์ ํ๋์ ์ธ์คํด์ค๋ฅผ ๊ณต์ ํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ค์ผ ์ ์์ง๋ง, ๋ชจ๋ ๊ฐ์ฒด์ ์ ์ฉํ๋ฉด ๋ถํ์ํ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ด ์ฆ๊ฐํ ์ ์๋ค.
- ์ค์ฝํ ๋ฒ์ ์ฌ์ฉ : ์ ํ๋ฆฌ์ผ์ด์ ๋ฒ์, ์์ฒญ ๋ฒ์, ์ธ์ ๋ฒ์ ๋ฑ ๋ค์ํ ์ค์ฝํ๋ฅผ ์ ์ํ์ฌ ํ์์ ๋ฐ๋ผ ๊ฐ์ฒด๋ฅผ ์ฌ์ฌ์ฉํ๋ค. ์น ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ์์ฒญ ๋จ์์ ๋ฒ์๋ฅผ ์ค์ ํ์ฌ ์ฑ๋ฅ์ ์ต์ ํํ ์ ์๋ค.
3. ์ง์ฐ ์ด๊ธฐํ์ ํ๋ก๋น์ ๋
1. ๋ฌธ์ ์
๋ชจ๋ ์์กด์ฑ์ ํ ๋ฒ์ ์ฃผ์ ํ์ฌ ์ด๊ธฐํํ๋ฉด, ์ ํ๋ฆฌ์ผ์ด์ ์์ ์๊ฐ์ด ์ฆ๊ฐํ๊ณ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ๋์ด๋ ์ ์๋ค.
2. ๊ฐ์ ๋ฐฉ๋ฒ
- ์ง์ฐ ์ด๊ธฐํ(Lazy Initialization): ํ์ํ ์์ ์๋ง ๊ฐ์ฒด๋ฅผ ์ด๊ธฐํํ๋๋ก ํ์ฌ ์ด๊ธฐ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ค์ธ๋ค. ์ง์ฐ ์ด๊ธฐํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด๊ธฐํ ์๊ฐ์ ๋จ์ถํ๊ณ , ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๋ฐ ๋์์ด ๋๋ค.
- ํ๋ก๋ฐ์ด๋ ํจํด ์ฌ์ฉ: ํ๋ก๋ฐ์ด๋ ํจํด์ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด๋ฅผ ํ์ํ ๋๋ง๋ค ์์ฑํ๊ฑฐ๋ ์ ๊ณตํ ์ ์๋ค. ์ด๋ ํนํ ์์ฑ ๋น์ฉ์ด ๋์ ๊ฐ์ฒด์ ์ ๋ฆฌํ๋ค.
์
// ์ง์ฐ ์ด๊ธฐํ ์์
class Car @Inject constructor(engineProvider: Provider<Engine>) {
private val engine: Engine by lazy { engineProvider.get() }
fun drive() {
engine.start()
// ๋๋ผ์ด๋ธ ๋ก์ง
}
}
4. ๊ณผ๋ํ ๋ฆฌํ๋ ์
์ฌ์ฉ
1. ๋ฌธ์ ์
์ผ๋ถ DI ์ปจํ ์ด๋๋ ๋ฆฌํ๋ ์ ์ ์ฌ์ฉํ์ฌ ์์กด์ฑ์ ์ฃผ์ ํ๊ฑฐ๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค. ๋ฆฌํ๋ ์ ์ ๋ฐํ์์ ํด๋์ค ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์กฐ์ฌํ๊ณ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ผ๋ก, ์ฑ๋ฅ์ ๋ถ์ ์ ์ธ ์ํฅ์ ๋ฏธ์น ์ ์๋ค.
2. ๊ฐ์ ๋ฐฉ๋ฒ
- ์ปดํ์ผ ํ์ ์ฝ๋ ์์ฑ ์ฌ์ฉ: ์ปดํ์ผ ํ์์ ์์กด์ฑ์ ํด์ํ๊ณ ์ฝ๋๋ฅผ ์์ฑํ์ฌ ๋ฆฌํ๋ ์ ์ ์ต์ํํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค. Dagger 2๋ ์ด๋ฌํ ๋ฐฉ์์ผ๋ก ์ฑ๋ฅ์ ๊ฐ์ ํ๋ค.
- ๋ฆฌํ๋ ์ ์ต์ํ: ํ์ํ ๊ฒฝ์ฐ์๋ง ๋ฆฌํ๋ ์ ์ ์ฌ์ฉํ๊ณ , ์ต๋ํ ์ฌ์ฉ์ ์ค์ด๋ ๋ฐฉํฅ์ผ๋ก ์ค๊ณํ๋ค.
5. ๋ณต์กํ ์์กด์ฑ ๊ทธ๋ํ
1. ๋ฌธ์ ์
๋ณต์กํ ์์กด์ฑ ๊ทธ๋ํ๋ DI ์ปจํ ์ด๋์ ์ฑ๋ฅ์ ์ ํ์ํฌ ์ ์๋ค. ๊ฐ์ฒด ๊ฐ์ ์์กด์ฑ์ด ์ฝํ๊ณ ์ค์ผ์์ผ๋ฉด ๊ฐ์ฒด ์์ฑ์ ์ต์ ํํ๊ธฐ ์ด๋ ค์์ง๊ณ , ์ด๋ ์ฑ๋ฅ ๋ฌธ์ ๋ก ์ด์ด์ง ์ ์๋ค.
2. ๊ฐ์ ๋ฐฉ๋ฒ
- ์์กด์ฑ ๋จ์ํ: ๊ฐ์ฒด ๊ฐ์ ์์กด์ฑ์ ๋ถ์ํ๊ณ , ๋ถํ์ํ ์์กด์ฑ์ ์ ๊ฑฐํ์ฌ ๊ทธ๋ํ๋ฅผ ๋จ์ํํ๋ค.
- ๋ชจ๋ํ: ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ชจ๋ํํ์ฌ ๊ฐ ๋ชจ๋์ด ๋ ๋ฆฝ์ ์ผ๋ก ์์กด์ฑ์ ๊ด๋ฆฌํ๋๋ก ์ค๊ณํ๋ค.
์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํ ์ค์ง์ ์ธ ํ
1. ์ปดํ์ผ ํ์ ์์กด์ฑ ์ฃผ์
- Dagger 2: ์๋๋ก์ด๋์์ ๋ง์ด ์ฌ์ฉํ๋ Dagger 2๋ ์ปดํ์ผ ํ์์ ์์กด์ฑ์ ํด์ํ๊ณ ์ฝ๋๋ฅผ ์์ฑํ์ฌ ๋ฐํ์ ์ฑ๋ฅ์ ์ต์ ํํ๋ค. ์ ๋ ธํ ์ด์ ํ๋ก์ธ์๋ฅผ ํตํด ์์กด์ฑ ๊ทธ๋ํ๋ฅผ ๋ถ์ํ๊ณ , ์ง์ ์์ฑ๋ ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ ์ฑ๋ฅ์ ํฅ์์ํจ๋ค.
2. ์ง์ฐ ์ด๊ธฐํ ๋ฐ ํ๋ก๋ฐ์ด๋ ์ฌ์ฉ
- Lazy ๋ฐ Provider ์ฌ์ฉ: ์๋๋ก์ด๋์์๋ Dagger์ `Lazy` ๋ฐ `Provider`๋ฅผ ์ฌ์ฉํ์ฌ ํ์ํ ์์ ์ ๊ฐ์ฒด๋ฅผ ์ด๊ธฐํํ๊ฑฐ๋ ์ ๊ณต๋ฐ์ ์ ์๋ค.
class Car @Inject constructor(lazyEngine: Lazy<Engine>) {
private val engine by lazyEngine
fun start() {
engine.start()
}
}
3. ์ค์ฝํ ์ฌ์ฉ
- ์ค์ฝํ ์ ์ : DI ์ปจํ ์ด๋์์ ์ฑ๊ธํค์ด๋ ๋ค๋ฅธ ์ค์ฝํ๋ฅผ ์ ์ํ์ฌ ๊ฐ์ฒด์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํ๋ค. ์๋ฅผ ๋ค์ด, ์กํฐ๋นํฐ๋ ํ๋๊ทธ๋จผํธ ์์ค์ ์ค์ฝํ๋ฅผ ์ค์ ํ์ฌ ๊ฐ์ฒด๋ฅผ ์ฌ์ฌ์ฉํ๋ค.
@Module
@InstallIn(ActivityComponent::class)
object ActivityModule {
@Provides
@ActivityScoped
fun provideCar(engine: Engine): Car {
return Car(engine)
}
}
4. ์์กด์ฑ ๊ทธ๋ํ ์ต์ ํ
- ๊ทธ๋ํ ์ต์ ํ: ์์กด์ฑ ๊ทธ๋ํ๋ฅผ ์ต์ ํํ์ฌ ๋ถํ์ํ ๊ฐ์ฒด ์์ฑ์ ์ค์ด๊ณ , ๊ฐ๊ฒฐํ ์์กด์ฑ ๊ด๊ณ๋ฅผ ์ ์งํ๋ค. ์ด๋ ์ฑ๋ฅ๋ฟ๋ง ์๋๋ผ ์ ์ง๋ณด์์ฑ๋ ํฅ์์ํจ๋ค.
5. ํ์ํ ๊ฒฝ์ฐ ์ง์ ์ฃผ์
- ์ง์ ์ฃผ์ : DI ์ปจํ ์ด๋๋ฅผ ์ฌ์ฉํ์ง ์์๋ ๋๋ ๊ฐ๋จํ ๊ฒฝ์ฐ๋ ์ฑ๋ฅ์ด ์ค์ํ ๊ฒฝ์ฐ, ์ง์ ๊ฐ์ฒด๋ฅผ ์ฃผ์ ํ์ฌ ์ฑ๋ฅ์ ์ต์ ํํ ์ ์๋ค. ์๋ฅผ ๋ค์ด, ์์ฑ ๋น์ฉ์ด ๋ฎ๊ณ ๊ฐ๋จํ ๊ฐ์ฒด๋ ์ง์ ์์ฑํ์ฌ ์ฌ์ฉํ๋ค.
6. ๋ฏธ๋ฆฌ ์ปดํ์ผ๋ ์ฝ๋๋ฅผ ์ฌ์ฉ
- ๋ฏธ๋ฆฌ ์ปดํ์ผ๋ ์ฝ๋ ์ฌ์ฉ: ๊ฐ๋ฅํ๋ค๋ฉด DI ์ปจํ ์ด๋์์ ๋ฏธ๋ฆฌ ์ปดํ์ผ๋ ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐํ์ ์ค๋ฒํค๋๋ฅผ ์ค์ธ๋ค.
7. ์บ์ ์ฌ์ฉ
- ์บ์: ์์ฃผ ์ฌ์ฉ๋๋ ๊ฐ์ฒด๋ฅผ ์บ์ฑํ์ฌ ๊ฐ์ฒด ์์ฑ์ ์ต์ํํ๊ณ , ์ฑ๋ฅ์ ํฅ์์ํจ๋ค. ์บ์๋ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ๋๋ฆด ์ ์์ผ๋ฏ๋ก, ์ ์ ํ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๊ฐ ํ์ํ๋ค.
๊ฒฐ๋ก
DI ์ปจํ
์ด๋๋ ๊ฐ์ฒด ๊ฐ์ ์์กด์ฑ์ ๊ด๋ฆฌํ๊ณ ์ฃผ์
ํ์ฌ ์ฝ๋์ ์ ์ฐ์ฑ๊ณผ ์ฌ์ฌ์ฉ์ฑ์ ๋์ด๋ ๋๊ตฌ๋ค. ๊ทธ๋ฌ๋ ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น ์ ์๋ ์์๋ค์ด ์กด์ฌํ๋ฉฐ, ์ด๋ฌํ ์์๋ค์ ์ดํดํ๊ณ ๊ฐ์ ํ๋ ๊ฒ์ด ์ค์ํ๋ค. ์ ์ ํ DI ์ปจํ
์ด๋์ ์ ํ๊ณผ ํจ๊ป ์ฑ๋ฅ ์ต์ ํ ์ ๋ต์ ์ ์ฉํ๋ฉด, ์ฑ๋ฅ์ ํฅ์์ํค๊ณ ์์ ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฐ๋ฐํ ์ ์๋ค.
์ด๋ฌํ ์ ๋ต์ ํตํด DI ์ปจํ
์ด๋์ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ , ์ ํ๋ฆฌ์ผ์ด์
์ ์ ์ฐ์ฑ๊ณผ ํจ์จ์ฑ์ ๊ทน๋ํํ ์ ์๋ค.
'๋น ๊ตฌ๋ฉ ์ฑ์ฐ๊ธฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Android] ๋ฐ์น ๋ชจ๋ ์ข ๋ฅ ๋ฐ ๊ฐ ์ฅ๋จ์ (0) | 2024.07.30 |
---|---|
[Android]์กํฐ๋นํฐ์ ๋ฐ์น๋ชจ๋์ ํ๋๊ทธ์ ์ฐจ์ด (0) | 2024.07.30 |
[DI] DI ์ปจํ ์ด๋์ ๋์ ์๋ฆฌ์ ์ฃผ์ ๊ธฐ๋ฅ (0) | 2024.07.30 |
[JVM] ํด๋์ค ๋ก๋ฉ ์ง์ฐ ๋ฐ ํด๊ฒฐ ๋ฐฉ์ (0) | 2024.07.29 |
[Java][JVM][OOP] ์๋ฐ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ + ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ ๊ฐ๋ ์ง์ (0) | 2024.07.29 |