오늘은, DI와 DIP 의존성 주입에 대해 알아보고 정리하고자 한다.
해당 글은 인프런:객체지향 프로그래밍 기초 강의와 검색 및 기존 알고있던 지식을 기반으로 작성하였다.
두 가지 전부 의존성 주입에 관련된 이야기지만 이 내용의 핵심은 어떻게 의존성을 주입하는가? 가 포인트인것 같았다.
DI ( Dependency - injection )
의존성 주입(Dependency Injection, DI)으로서, 외부에서 의존 객체를 주입함을 의미한다.
의존성 주입(DI)의 의도는 객체의 생성과 사용의 관심을 분리하는 것 이는 가독성과 코드 재사용성을 높여준다.
의존성 주입은 다음과 같은 문제를 해결한다고 한다.
- 어떻게 애플리케이션이나 클래스가 객체의 생성 방식과 독립적일 수 있는가?
- 어떻게 객체의 생성 방식을 분리된 구성 파일에서 지정할 수 있는가?
- 어떻게 애플리케이션이 다른 구성을 지원할 수 있는가?
마틴 파올러는 DI의 관한 의존성 주입 패턴 세 가지를 제안하였다.
- 생성자 주입 : 필요한 의존성을 모두 포함하는 클래스의 생성자를 만들고 그 생성자를 통해 의존성을 주입한다.
- 세터(Setter)를 통한 주입 : 의존성을 입력받는 세터(Setter) 메서드를 만들고 이를 통해 의존성을 주입한다.
- 인터페이스(Interface)를 통한 주입 : 의존성을 주입하는 함수를 포함한 인터페이스를 작성하고 이 인터페이스를 구현하도록 함으로써 실행 시에 이를 통하여 의존성을 주입한다.
DI 장점은 다음과 같다.
- 상위 타입을 사용할 경우 의존 대상이 바뀌면 조립기(설정)만 변경하면 된다.
- 의존하는 객체 없이 대역 객체를 사용해서 테스트 가능
DIP ( Dependency Inversion principle )
의존관계 역전 원칙 (DIP)는 소프트웨어 모듈들을 분리하는 특정 형식을 지칭한다.
해당 원칙은 상위 계층(정책 결정)이 하위 계층(세부 사항)에 의존하는 전통적인 의존관계를 반전(역전)시킴으로써 상위 계층이 하위 계층의 구현으로부터 독립되게 할 수 있다는걸 의미한다.
즉, 해당 원칙은 상위 계층이 하위계층에 의존하면안되고, 저수준모듈은 고수준 모듈에서 정의한 추상 타입에 의존해야 한다.
그럼 이러한 DIP는 어떠한 장점을 가지고 있을까?
- 유연함을 높인다.
- 고수준 모듈의 변경을 최소화하면서 저수준 모듈의 변경 유연함을 높인다
- 위 그림을 보면 알 수 있듯, Controller에 대해 Interface를 두고, 해당 정책 및 기획이 바뀌었을 때 하위 계층에 대한 처리를 유연하게 바꾸는 것이 가능하다.
결론
두 의존성 주입의 경우 DI는 위에서 아래, DIP는 상위와 하위 두 가지로 나눠 하위가 상위 계층으로 의존성을 주입함임을 느낄 수 있었다.
회사든 이후 프로젝트 할당을 받았을 때 해당 기능에 대한 상위, 하위에 대한 분류를 한 후 조금 더 유연한 설계를 해야 함을 다시 한번 느낄 수 있던 계기였다.
'Spring' 카테고리의 다른 글
Throttling과 debounce에 대해 알아보자 (0) | 2022.12.11 |
---|---|
[Design Pattern] Strategy Pattern 전략패턴에 대해 알아보자! (0) | 2022.10.30 |
[SpringBoot - 인프런] Batch Meta Data (0) | 2022.08.22 |
[SpringBoot - 인프런] EnableBatchProcessing (0) | 2022.08.20 |
[인프런/개념] 스프링 배치 : 아키텍처 (0) | 2022.08.12 |