이번 공부 할 내용은 안드로이드 개발 시 필수 적인 DI를 알아보겠다.
# DI(Dependncy Injection)란?
의존성 주입을 먼저 알아보기 전에 의존성을 알아야 이해가 더 쉽기 때문에 의존성을 먼저 알아보자!
## 의존성(Dependncy)이란?
- 객체지향 언어에서는 두 클래스 간 관계를 의미한다.
예를 들면 "A.class가 B.class를 의존한다"라고 했을 때 B.class가 변경 또는 추가가 되면 A.class도 영향을 미치는 것이다.
더욱더 자세히 예제를 만들어 보면 "자동차는 엔진에 의존한다"라는 의존성 예제가 있으면 엔진을 수정하게 되면 수정된 엔진에 따라서 자동차를 수정해야 한다.
엔진의 변화가 자동차에게도 영향을 미쳤기 때문에 자동차는 엔진에 의존한다고 볼 수 있다.
이제 이것을 코드로 만들어 보면 아래와 같다.
class Car {
private val engine = Engine()
fun start() {
engine.start()
}
}
fun main() {
val car = Car()
car.start()
}
class Engine {
fun start() {}
}
이 두 개의 클래스 관계를 그림으로 나타내면 위와 같이 표현이 된다.
여기서 만약 일반 엔진이 아니라 가스엔진, 전기엔진처럼 엔진 유형이 두 가지라면 하나의 자동차를 사용하는 대신 두 가지 유형의 자동차를 만들어야 한다.
이런 방식으로 의존을 하게 되면 아래와 같은 문제점들이 있다
- 코드의 재사용이 어려워진다
- 다양한 테스트를 하기 힘들다
- 생산성이 떨어진다
- 오류가 발생할 가능성이 높아진다
이러한 문제점을 없애기 위해 외부에서 객체를 주입하는 것을 의존성 주입(Dependncy Injection)이다.
# DI(Dependncy Injection) 구현 방법
- 생성자 이용
- 필드 삽입(또는 setter 삽입)
- 라이브러리 이용
## 1. 생성자 이용
class Car(private val engine: Engine) {
fun start() {
engine.start()
}
}
fun main() {
val engine = Engine()
val car = Car(engine)
car.start()
}
class Engine {
fun start() {}
}
자동차는 엔진을 외부에서 받아옴으로써 어떠한 엔진이 들어와도 자유로워졌다.
이러한 방법을 사용해 다양한 시나리오를 테스트할 수 있다.
아래와 같은 사진으로 바뀐다.
## 2. 필드 삽입(또는 setter 삽입)
class Car {
lateinit var engine: Engine
fun start() {
engine.start()
}
}
fun main() {
val car = Car()
car.engine = Engine()
car.start()
}
class Engine {
fun start() {}
}
위 1,2번 방법에도 문제가 있다.
이 예제의 경우는 종속되는 객체가 하나였지만(엔진) 만약 엔진뿐만 아니라 여러 개라면 엄청 복잡해질 것이다.
그래서 안드로이드에서 DI를 자동으로 쉽게 해주는 라이브러리를 제공한다.
3번이 그런 방법인데 이 부분은 따로 포스팅을 하겠다.
# 느낀점
블로그로 정리하면서 공부를 해도 아직 이해가 정확히 되지는 않아서 계속해서 공부를 해야겠다..!
역시 DI는 어려운 거 같다 (나만 그런 거 일수도 있고..)
참고자료
https://developer.android.com/training/dependency-injection?hl=ko#what-is-di
https://gus0000123.medium.com/android%EA%B0%9C%EB%B0%9C%EC%9E%90%EA%B0%80-%EB%B3%B8-di-%EB%9E%80-dependency-injection-876b61dd0799
https://ardor-dev.tistory.com/67
https://tecoble.techcourse.co.kr/post/2021-04-27-dependency-injection/
https://jionchu.tistory.com/123
'안드로이드 공부 노트' 카테고리의 다른 글
[Android] 안드로이드 앱 아이콘 바꾸기, 앱 아이콘 이미지 적용법(런처 아이콘 변경) - App Icon Change (0) | 2023.11.06 |
---|---|
[Android-Hilt] 안드로이드 Hilt(힐트)란? (0) | 2023.04.19 |
[Android] 안드로이드 전화번호 포맷 맞춰주기 (전화번호 사이에 하이픈(-) 넣기) (0) | 2022.12.28 |
[Android] 안드로이드 Parcelable(@Parcelize) 사용해 액티비티간 데이터(Object) 전달하기 - Kotlin (0) | 2022.10.28 |
[Android - Glide] 안드로이드 이미지 로드 라이브러리 Glide 사용법 - Kotlin (0) | 2022.10.09 |