티스토리 뷰
What is DI ?
References
What is DI ?
의존성 주입을 이해하기 위해 의존성의 개념부터 짚고 가겠다.
Dependency ( 의존성 ) ?
SOLID 에서 Dependency Inversion Principle ( DIP, 의존 관계 역전 원칙 ) 을 이해하고 있다면 의존성을 이해하기 쉽다. DIP 에 대해서는 추후 포스팅 할 예정이다.
DIP 는 이렇게 정의하고 있다.
고차원의 모듈은 저차원의 모듈에 의존하면 안 된다. 이 두 모듈 모두 다른 추상화 된 것에 의존해야 한다.
추상화 된 것은 구체적인 것에 의존하면 안 된다. 구체적인 것이 추상화 된 것에 의존해야 한다.
고수준 모듈 : 어떤 의미가 있는 단일 기능을 제공하는 모듈
저수준 모듈 : 고수준 모듈의 기능을 구현하기 위해 필요한 하위 기능을 실제로 구현한 것
말이 어려우니 예제 코드로 살펴보자. ( 출처 : http://wonwoo.ml/index.php/post/1717 )
아래 예제는 어떤 바이트 데이터를 읽어와 특정한 데이터로 결과를 반환 하는 예제이다.
여기서 고수준 모듈은 바이트 데이터를 읽어와 특정한 데이터로 결과를 반환하는 것이다.
그리고 저수준 모듈은 파일에서 바이트 데이터를 읽어오고, Json 데이터로 겨로가를 반환하는 것이다.
/*
고수준 모듈
*/
class Response {
private JsonConverter jsonConverter = new JsonConverter();
public String response() {
byte[] bytes = null;
return jsonConverter.convert(bytes);
}
}
/*
저수준 모듈
*/
class JsonConverter {
public String convert(byte[] bytes) {
// json converting ...
return "json txt";
}
}
고수준 모듈인 Response
가 저수준 모듈인 JsonConverter
의 구현에 의존되고 있다. 즉, DIP 원칙을 어기고 있다.
이를 해결하기 위한 DI 는 계속해서 설명하기로 하고 먼저,
의존성 ( Dependency ) 가 위험한 이유에 대해서 알고 가자.
하나의 모듈이 바뀌면 의존한 다른 모듈까지 변경이 이루어지기 때문
테스트 가능한 어플을 만들 때 의존성이 있으면 유닛 테스트 작성이 어렵다
( 유닛 테스트의 목적 자체가 다른 모듈로부터 독립적으로 테스트하는 것을 요구하기 때문에 )
DI ?
이제 저런 의험성을 없애기 위해 DI 가 필요하다는 것 까지 이해가 되었다.
그렇다면 DI 의 정의는 무엇일까 ?
프로그래밍에서 구성요소간의 의존 관계가 소스코드 내부가 아닌 외부의 설정 파일 등을 통해 정의되게 하는 디자인 패턴 중 하나.
[ 출처 : https://ko.wikipedia.org/wiki/%EC%9D%98%EC%A1%B4%EC%84%B1_%EC%A3%BC%EC%9E%85 ]
위 링크를 타고 가보면 UML 로 간단히 정리가 되어있지만, 나는 UML 과 친숙하지 않아서 예제 코드로 이해했다.
위키에서 설명하는 DI 의 이점으로 모듈간의 결합도 저하, 코드의 재사용성, 단위 테스트의 편의성 향상 등이 있다.
또한, DI 의 적용 유형으로 생성자 주입, 세터를 통한 주입, 인터페이스를 통한 주입을 제시하였다. 이 내용은 위키에 잘 나와있으니 링크를 통해 참고하자.
그럼 아래의 예제 코드를 부며 DI 를 이해해 보자.
https://faith-developer.tistory.com/147
Dagger 에서도 사용하고 있는 Coffee Maker 예제라고 한다. 이 예제를 보면 알 수 있듯이, DI 의 핵심은 의존성 주입으로 인한 모듈간 결합도 저하 이다.
References
https://gmlwjd9405.github.io/2018/11/09/dependency-injection.html
https://faith-developer.tistory.com/147
https://tony-programming.tistory.com/entry/Dependency-%EC%9D%98%EC%A1%B4%EC%84%B1-%EC%9D%B4%EB%9E%80
http://wonwoo.ml/index.php/post/1717
https://ko.wikipedia.org/wiki/%EC%9D%98%EC%A1%B4%EC%84%B1_%EC%A3%BC%EC%9E%85
'프로그래밍 > 프로그래밍' 카테고리의 다른 글
선언형 / 명령형 프로그래밍 (0) | 2019.08.25 |
---|---|
개방-폐쇄 원칙 (Open-Closed Principle, OCP) (0) | 2019.03.12 |
단일 책임 원칙 (Single Responsibility Principle, SRP) (0) | 2019.03.10 |
객체 지향 설계 (SOLID) (0) | 2019.03.03 |
리스코프 치환 원칙(Liskov substitution principle, LSP) (0) | 2019.03.03 |