1. 의존성 주입이란?
- 의존성 주입(DI, Dependency Injection)
- 하나의 객체의 다른 객체의 의존성을 제공하는 기술
- 의존성과 주입
- 의존성 : 객체 지향에서 두 클래스 간의 관계, 일반적으로 둘중 하나가 다른 하나를 필요로함
class CPU
class Computer {
private val cpu: CPU
init {
cpu = CPU()
}
}
- 위 코드를 보면
- 컴퓨터를 생성할 떄 CPU가 강하게 결합한다.
- 다른 CPU로 변경이 불가능 -> 'Computer가 CPU에 의존성을 갖는다'
- 주입 : 생성자나 메서드를 통해 외부로 부터 생성자 객체를 전달 받는 것
class CPU
class Computer {
private var cpu: CPU? = null
fun setCPU(cpu: CPU) {
this.cpu = cpu
}
}
- 위 코드는
setCPU()
로 부터 외부에서 생성된 객체를 받아온다 - 즉, 의존 관계에 있는 클래스의 객체를 외부로 부터 생성하여 주입받음.
2. 의존성 주입의 필요성
- 의존성 주입 꼭 해야하는가
변경의 전이
- (앞서 보인 예제 코드에서)cpu를 변경하고 싶은 경우
class Computer {
private val cpu: A_CPU
init {
cpu = A_CPU()
}
}
- CPU를 의존하고 있던 Computer 클래스의 코드 수정이 필요하게된다...
- 하나의 클래스 변경으로 다른 의존 관계 까지 변경사항이 전달됨
- 이를 위해 CPU를 인터페이스로 만든다면
interface CPU
class A_CPU : CPU
class Computer {
private val cpu: CPU
init {
cpu = A_CPU()
//cpu = new I_CPU()
}
}
- 이래도 의존성이 생긴다
- Computer 에서 CPU를 생성하기 때문에 Computer 클래스를 어쩔수없이 변경해야함
제어의 역전(IoC, Inversion of Control)
- 특정 일을 수행하도록 만들어진 프레임워크에 제어권을 위임 -> 관심사를 분리
class Computer {
private var cpu: CPU? = null
constructor() {}
constructor(cpu: CPU) {
this.cpu = cpu
}
fun setCPU(cpu: CPU) {
this.cpu = cpu
}
}
fun main() {
val cpu = I_CPU()
val computer1 = Computer(cpu)
val computer2 = Computer()
computer2.setCPU(cpu)
}
- 외부로 부터 CPU를 생성해서 주입시키고 있음
- 결합도를 낮췄다!
의존성 주입의 장단점
- 장점
- 의존성 주입은 인터페이스를 기반으로 설계되며, 코드를 유연하게 함
- 주입하는 코드만 따로 변경하기 쉬워. 리팩토링 수월
- 의존성 주입을 사용하는 결과로 stub 또는 mock 객체를 사용해서 단위 테스트 하기 더 쉬워짐👍
- 클래스 간 결합도를 느슨하게
- 인터페이스 기반이므로 여러 개발자가 서로 사용하는 클래스를 독립적으로 개발 가능 (클래스간 의존하는 인터페이스만 알면됨)
- 단점도 있다
- 간단한 프로그램을 만들때는 번거롭다.
- 동작과 구성을 분리하게 되면서 코드 추적이 어려워지고 가독성을 떨어뜨릴 수 있음 (더 많은 파일을 와리가리 해야함)
- Dagger2와 같은 의존성 주입 프레임워크는 컴파일 타임에 애노테이션 프로세서를 이용하여 파일을 생성하므로 빌드에 시간 소요가 좀 늘어난다.
- 지속적인 유지보수가 필요한 일반적인 상용 앱의 경우에는 장점이 더욱 많다.
- 코드 가독이 어려워지는 것은 적응하면 그래도 수월해질 수 있음. 😂
2021.07.19 - [Android/클린 아키텍처] - [Clean Architecture] 04-안드로이드 앱 설계 패턴 (MVC, MVP, MVVM)
2021.07.17 - [Android/클린 아키텍처] - [Clean Architecture] 03-안드로이드 권장 애플리케이션 설계 원칙
2021.07.16 - [Android/클린 아키텍처] - [Clean Architecture] 02-안드로이드 클린 아키텍처
해당 글은 '아키텍처를 알아야 앱 개발이 보인다' 를 공부하며 요약 정리한 글 입니다.
'Android > 클린 아키텍처' 카테고리의 다른 글
[Clean Architecture] 07-Dagger2의 모듈(Module) (0) | 2021.07.21 |
---|---|
[Clean Architecture] 06-Dagger2 란? (+ Adnroid 적용 샘플) (0) | 2021.07.20 |
[Clean Architecture] 04-안드로이드 앱 설계 패턴 (MVC, MVP, MVVM) (0) | 2021.07.19 |
[Clean Architecture] 03-안드로이드 권장 애플리케이션 설계 원칙 (2) | 2021.07.17 |
[Clean Architecture] 02-안드로이드 클린 아키텍처 (1) | 2021.07.16 |