๋จผ์ ์ข ์ ํญ๋ชฉ ์ฃผ์ ์๋ ์ฉ ์ฝ๋๋ฅผ ๋จผ์ ๋ณด์.
class Engine{
fun start(){
println("์๋ ๊ฑธ๊ธฐ")
}
}
class Car {
private val engine = Engine()
fun start() {
engine.start()
}
}
fun main(){
val di = Car()
di.start()
}
Engine์ ์์ฑ์๋ฅผ ์ง์ ํธ์ถํด์ Engine์ instance๋ฅผ ๋ง๋ค๊ณ , ๊ทธ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๋ฐฉ์์ผ๋ก ํด๋์ค ๊ฐ ๋ฉ์๋ ์ฌ์ฉ์ ํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ๋ฐ๊ฟ๋ณผ ์ ์๋ค.
์์ ์ปดํฌ๋ํธ๊ฐ ํ์ ์ปดํฌ๋ํธ์ ๋ฐ๋ก ์ ๊ทผํ์ง์๊ณ , ์์์ปดํฌ๋ํธ๋ ํ์์ปดํฌ๋ํธ๋ฅผ ์ฃผ์ ๋ฐ๋ ํํ๋ก, ์ปจํธ๋กค ๋ฐ์ (Inversion Of Control)์ ๊ธฐ๋ฐ์ผ๋ก ํ ์์กด์ฑ ์ฃผ์ (Dependency Injection)์ด ์ด๋ค์ง๋ค.
DI?
DI๋ฅผ ์ฐ๋ ์ด์ ๋ ํฌ๊ฒ ์ธ ๊ฐ์ง๋ก ์์ฝํ ์ ์๋ค.
- ํด๋์ค ์ฌ์ฌ์ฉ ๊ฐ๋ฅ ๋ฐ ์ข
์ ํญ๋ชฉ ๋ถ๋ฆฌ
- ๋ฐ์์ฌ ์ข ์ ํญ๋ชฉ์ ์ฝ๊ฒ ๊ต์ฒดํ ์ ์๋ค. ํด๋์ค๊ฐ ๋ ์ด์ ์ข ์ ํญ๋ชฉ ์์ฑ ๋ฐฉ๋ฒ์ ์ ์ดํ์ง ์๊ณ ๋์ ๋ชจ๋ ๊ณณ์์ ๊บผ๋ด ์ธ ์ ์๋ค.(์ปจํธ๋กค ๋ฐ์ )
- ๋ฆฌํฉํฐ๋ง ํธ์์ฑ
- ์ข ์ ํญ๋ชฉ์ ์ธํฐํ์ด์ค๋ฅผ ํตํด ํ์ธํ ์ ์๊ณ ๊ตฌํ ์ธ๋ถ์ ๋ณด๋ก ์จ๊ฒจ์ง์ง ์๊ณ (ํด๋์ค ๋ด๋ถ์์ ์์ฑ) ๊ฐ์ฒด ์์ฑ ์๊ฐ ๋๋ ์ปดํ์ผ ์๊ฐ์ ํ์ธํ ์ ์๋ค.
- ํ
์คํธ ํธ์์ฑ
- ํด๋์ค๋ ์ข ์ ํญ๋ชฉ์ ๊ด๋ฆฌํ์ง ์์ผ๋ฏ๋ก ํ ์คํธ ์ ๋ค์ํ ๊ตฌํ์ ์ ๋ฌํ์ฌ ๋ค์ํ ๋ชจ๋ ์ฌ๋ก๋ฅผ ํ ์คํธํ ์ ์๋ค. ํ ์คํธ๋ฅผ ์งํํด๋ณด์ง ์์์ ์ด ๋ถ๋ถ์ ๋ํด์๋ ๊ฒฝํํด๋ณผ ํ์๊ฐ ์๋ค...
์ปจํธ๋กค ๋ฐ์ ?
์ปจํธ๋กค ๋ฐ์ ์ ์ํํธ์จ์ด ๋์์ธ ํจํด ์ค ํ๋๋ก, ์์กด์ฑ์ ์ ์ด ํ๋ฆ์ ์ญ์ ์ํด์ผ๋ก์จ ์์คํ ์ ๋ชจ๋ํ์ ์ ์ฐ์ฑ์ ํฅ์์ํจ๋ค. ์ผ๋ฐ์ ์ธ ์ ์ด ํ๋ฆ์ ์ผ๋ฐ์ ์ผ๋ก ๊ณ ์์ค ๋ชจ๋์ด ์ ์์ค ๋ชจ๋์ ์์กดํ๋ ๋ฐฉ์์ผ๋ก ์ด๋ฃจ์ด์ง๋ค. ์ปจํธ๋กค ๋ฐ์ ์ ์ฌ์ฉํ๋ฉด ์ ์์ค ๋ชจ๋์ด๋ ์ธ๋ถ ๋ฆฌ์์ค์ ๋ํ ์ ์ด๋ฅผ ๊ณ ์์ค ๋ชจ๋์ด ์ง์ ํ์ง ์๊ณ , ๋์ ์ธ๋ถ์์ ์ด๋ฅผ ์ฃผ์ ๋ฐ์ ์ฌ์ฉํ๋ค.
flowchart TD
Hilt--> UseCase
Hilt <--> repo
์์ฑ์ ์ฃผ์ / ํ๋ ์ฃผ์ ์ผ๋ก ๋๋ ๋ณผ ์ ์๋ค.
class Car(private val engine: Engine) {
fun start() {
engine.start()
}
}
fun main(){
val engine = Engine()
val di = Car(engine)
di.start()
}
์์ฑ์์ฃผ์ ์ Engine์ ์์ฑ์๋ก ๋ฐ์์ ๋ฉค๋ฒ๋ณ์๋ก ์ฒ๋ฆฌํ์ฌ engine์ start ๋ฉ์๋๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค. Car์ ์ข ์ํญ๋ชฉ์ธ Engine์ ์์ฑ์๋ก ์ฃผ์ ๋ฐ์ ์ฝ๋๋ค. ⇒ ์์ฑ์ ์ฃผ์
class Engine {
fun start() {
println("Engine started")
}
}
class Car {
lateinit var engine: Engine
fun start() {
engine.start()
}
}
fun main() {
val engine = Engine()
val car = Car()
car.engine = engine
car.start()
}
ํ๋ ์ฃผ์ ์ ์์ฑ์๋ก ์ ๊ทผํ์ง ์์ง๋ง ์ข ์ํญ๋ชฉ์ ๋ฐ๋ก ๊ด๋ฆฌํด์ค์ผํ๋ค. ์ข ์ํญ๋ชฉ์ ์ฌ์ฉํ๊ธฐ ์ ์ car์ ๋ฉค๋ฒ์ ์ด๊ธฐํํด์ฃผ๋ ๊ณผ์ ์ ๊ฑฐ์ณ์ผํ๋ค.
์ด์ ๊น์ง๋ ์๋์ผ๋ก ์ข ์ํญ๋ชฉ์ ์ง์ ์ฃผ์ , ๊ด๋ฆฌํ๋ค. ⇒ ์ข ์ํญ๋ชฉ์ด ๋ง์์ง๊ฑฐ๋ ์ข ์ ํญ๋ชฉ์ ์ ๋ฌํ๊ธฐ ์ ์ ๊ตฌ์ฑํ ์ ์์ ๋๋ ๊ด๋ฆฌ๊ฐ ๋งค์ฐ ๊น๋ค๋ก์์ง๋ค.(์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ฐ๋ฐ์๊ฐ ์๊ฐํด์ ์ง์ผ๋๋ค.) ํนํ ์ข ์ํญ๋ชฉ์ lazyํ๊ฒ ์ ์ธํ์ผ๋ฉด ๋ฉ๋ชจ๋ฆฌ์์ ํด๋น ์ข ์ ํญ๋ชฉ์ ์ ์ฒด ๊ธฐ๊ฐ์ ๊ด๋ฆฌํ๋ ๋ง์ถค ์ปจํ ์ด๋(๋๋ ์ข ์ ํญ๋ชฉ ๊ทธ๋ํ)๋ฅผ ์์ฑํ๊ณ ์ ์งํด์ผ ํ๋ค. ์ด๊ฒ ๊น๋ค๋ก์ด๋ฐ, ์ด๊ฑธ ๋ผ์ด๋ธ๋ฌ๋ฆฌํํ ๋๊ธฐ๋๊ฒ Dagger, Hilt๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๊ด๋ฆฌํ๋ ค๋ฉด ์ฑ๊ธํค์ผ๋ก ์๋น์ค ๋ก์ผ์ดํฐ๋ฅผ ์์ฑํด์ ๊ฑฐ๊ธฐ์ ์ข ์ํญ๋ชฉ์ ๋ฐ์์ค๋ ํํ๋ก ๊ตฌํํ ์๋ ์๋ค.
object ServiceLocator { //singleton์ผ๋ก ์ด๊ธฐํ๋จ.
fun getEngine(): Engine = Engine()
}
class Car {
private val engine = ServiceLocator.getEngine()
fun start() {
engine.start()
}
}
fun main(args: Array){
}
์ฑ๊ธํค์ผ๋ก ์์ฑํด์ ์ฐ๋๊น ์ผํ๋ณด๊ธฐ์ ํฉํ ๋ฆฌํจํด์ ์ฌ์ฉํ๋ฉด์ ๊ฝค ๋ถ๋ฆฌ๋ ๊ฒ ์ฒ๋ผ ๋ณด์ธ๋ค. ๋ฌธ์ ๋ ์ข ์ ํญ๋ชฉ์ด API ๋ ธ์ถ ์์ญ(์ธํฐํ์ด์ค)์ด ์๋ ํด๋์ค ๊ตฌํ์์ ์ธ์ฝ๋ฉ ๋๋ค๋ ๊ฒ์ด๋ค. object๋ ํด๋์ค ์ ์ธ๊ณผ ๋์์ ์ฑ๊ธํค์ผ๋ก ์ ์ธํ๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ํด๋์ค๊ฐ ์ธ๋ถ์์ ํ์ํ ๊ฒ์ด ๋ฌด์์ธ์ง ์๊ธฐ๊ฐ ๋ ์ด๋ ค์์ง๊ณ ๊ฒฐ๊ณผ์ ์ผ๋ก Car ๋๋ ์๋น์ค ๋ก์ผ์ดํฐ์์ ์ข ์ ํญ๋ชฉ ์ ๋ณด๋ฅผ ๋ณ๊ฒฝํ๋ฉด ์ฐธ์กฐ๊ฐ ์คํจํ์ฌ ๋ฐํ์ ์ค๋ฅ ๋๋ ํ ์คํธ ์คํจ๊ฐ ๋ฐ์ํ ์ ์๋ค.
์๋์ผ๋ก ์์กด์ฑ ์ฃผ์ ํ๋ ๊ณผ์ ์ ๊ฒฝํํด๋ณผ ๊ฑด๋ฐ, Hilt๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฆฌ๊ฐ ์๋ค. Hilt๋ Dagger๋ฅผ ๊ณ์นํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ํ๋ก์ ํธ์ ๋ชจ๋ Android ํด๋์ค์ ์ปจํ ์ด๋๋ฅผ ์ ๊ณตํ๊ณ ์๋ช ์ฃผ๊ธฐ๋ฅผ ์๋์ผ๋ก ๊ด๋ฆฌํ๋ค. ์ปจํ ์ด๋๋ ์ผ์ข ์ ๊ฐ์ฒด ํฉํ ๋ฆฌ ์ญํ ์ ํ๋ค๊ณ ํ ์ ์๋๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑ ์์๋ค ๊ฐ์ ์์กด์ฑ์ ๊ด๋ฆฌํ๊ณ ํ์ํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์ ๊ณตํ๋ ์ญํ ์ ํ๋ค.
๋์์ด ๋๋ค๋ฉด ๋๊ธ์ด๋ ๊ณต๊ฐ ๋ฒํผ ํ ๋ฒ์ฉ ๋๋ฅด๊ณ ๊ฐ์ฃผ์ธ์! ๋ก๊ทธ์ธ ์ํด๋ ๋ฉ๋๋ค ^_^
'Android ๐ฅ๏ธ > DI๐' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
@Provides ์ @Binds (0) | 2024.08.02 |
---|---|
Android 15 ๋์ ํ๋ก์ ํธ ๊ตฌ์กฐ ๋ณํ... ๊ทธ๋ฆฌ๊ณ toml์์๋ณด๊ธฐ + Hilt ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ถ๊ฐํ๊ธฐ (0) | 2024.07.16 |
Hilt(3) - ๋ฉํฐ ๋ฐ์ธ๋ฉ (0) | 2024.07.05 |
Hilt(2) - ๋ฐ์ธ๋ฉ๊ณผ ์์กด์ฑ ์ฃผ์ (0) | 2024.07.05 |
Hilt(1) (0) | 2024.06.22 |