2022. 8. 20. 17:28ㆍ기본에 충실하자
Q. Dependency Injection(의존성 주입) 이란 무엇인가요?
어떤 A 객체가 다른 B 객체를 참조할때, A 객체는 B 객체에 의존한다라고 합니다. 또한 B 객체 같은 A에게 필요한 객체들을 Dependencies라고 합니다. 의존성 주입은 이러한 의존하는 객체를 외부에서 만들어 필요한 클래스에
https://developer.android.com/training/dependency-injection#kotlin
Android의 종속 항목 삽입 | Android 개발자 | Android Developers
Android의 종속 항목 삽입 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 종속 항목 삽입(DI)은 프로그래밍에 널리 사용되는 기법으로, Android 개발에 적합합니
developer.android.com
구글에 DI를 검색하면 엄청나게 많은 설명이 있습니다.
이번 포스트에서는 다양한 예를 참고하여 DI의 이해를 돕기 위해 정리해보겠습니다!
1. 자동차
2. 요리사
3. 컴퓨터
1,2,3에는 각각 필요한 것들이 있습니다.
1) 자동차에는 엔진이 필요하다.
2) 요리사는 레시피가 필요하다.
3) 컴퓨터에는 CPU가 필요하다.
자동차, 요리사, 컴퓨터 모두 "특정한 항목" 이 필요하다.
자동차는 엔진이, 요리사는 레시피가, 컴퓨터는 CPU를 필요로 합니다.
각각 엔진에 의존하고 레시피에 의존하고 CPU에 의존합니다. 즉 의존성이 생기게 됩니다.
Q. 그럼 주입은 뭘까요??
자동차의 설계도를 그리기로 했습니다..
설계도 안에 엔진도 넣고, 바퀴도 넣고, 유리창도 넣고, 회사 로고도 넣고
아무튼 설계도 안에다가 엔진도 만들어서 넣고 바퀴도 몇 인치인지 유리창 싹 다 넣었습니다.
이제 자동차를 만들어서 사용만 하면 됩니다.
근데 갑자기 엔진이 전기 엔진으로 바꿔서 출시하랍니다.
다시 설계도를 꺼내 설계도 안에 있는 엔진을 찾아서 바꿔줍니다.
엔진을 바꾸니 엔진이랑 연결된 다른것도 다 바꾸어 주어야하고
또 바퀴도 바꾸라고 합니다.
바퀴도 바꿔줍니다.
이렇게 만들면 당연히 효율성이 떨어지고 생산성이 감소합니다.
이런 문제를 해결하기 위해
자동차 설계도에는 엔진과 바퀴 등 항목을 어떻게 조립하고 사용하는지만 넣어두고
엔진, 바퀴, 유리창을 밖에다가 따로 만들어서 설계도에 넣어주는겁니다.
이게 의존성 주입입니다.
이제 자동차 설계도를 보면서 무언갈 찾아가며 반복하는 짓을 안해도 됩니다.
효율성이 올라가고 생산성이 올라갑니다. 결국 모든건 효율성때문에 만들었다. 반복적인 작업을 하지 않기 위해.
안드로이드 공홈의 코드를 보자.
class Car {
private val engine = Engine()
fun start() {
engine.start()
}
}
fun main(args: Array) {
val car = Car()
car.start()
}
자동차 클래스를 만들었고 그 안에 엔진이 있습니다. 그리고 자동자의 행위인 엔진 스타트 함수가 있습니다.
메인에서 car 라는 자동차를 새로 하나 만들고 자동차에 엔진을 걸었습니다.
위와 같은 상태를 어떻게 바꿔야할까요??
아래를 보겠습니다.
자동차 클래스의 생성자에 engine: Engine 을 주입하고 있습니다.
그리고 자동차 클래스 안에서는 행위만 구현하였습니다.
메인을 보면 engine 을 만들고
생성자 위치에 함수의 매개변수처럼 넣어주는 모습을 확인할 수 있습니다.
이제 엔진을 교체할때마다 자동차 클래스 안에 엔진을 바꿀 필요가 없게 됩니다.
만약 엔진을 변경해야한다면 엔진만 바꿔주면 됩니다.
근데 자동차에는 엔진만 있는게 아닙니다.
바퀴랑 유리창 좌석 안에 다른 부품들 다 있는데 그럴때마다 생성자에 다 넣어야한다면 또 효율성이 떨어지게 됩니다. 그래서 이런 경우 인터페이스를 사용할 수 있습니다.
인터페이스에 엔진 바퀴 유리창 좌석 다 넣어두고 Car 에 주면 자동차가 필요한 것들을 한번에 주입할 수 있게 됩니다. 여기서 중요한 것은 추상화를 통한 의존성 역전 원칙이다.
이렇게 의존성 주입을 통해 코드의 재사용성, 효율성, 리펙토링, 테스트, 유지보수에 많은 이점을 얻을 수 있습니다.
안드로이드에서는 힐트의 사용을 권장합니다.
이렇게 의존성 주입에 대해 정리하였습니다.
틀린것은 친절하게 알려주시면 대단히 감사하겠습니다.
Hilt를 통한 의존성 주입은 다른 편에서 다뤄보겠습니다.
'기본에 충실하자' 카테고리의 다른 글
한 번의 글로 이해하는 소프트웨어 아키텍처 패턴 ( MVC, MVP, MVVM ) (4) | 2023.04.18 |
---|---|
객체지향 5대원칙 SOLID (0) | 2023.01.07 |