상세 컨텐츠

본문 제목

[DI,DIP] 의존성 주입에 대하여

Spring

by 조킴 2022. 10. 12. 00:24

본문

반응형

오늘은, DI와 DIP 의존성 주입에 대해 알아보고 정리하고자 한다. 

해당 글은 인프런:객체지향 프로그래밍 기초 강의검색기존 알고있던 지식을 기반으로 작성하였다. 

 

두 가지 전부 의존성 주입에 관련된 이야기지만 이 내용의 핵심은 어떻게 의존성을 주입하는가? 가 포인트인것 같았다. 

 

DI ( Dependency - injection ) 

 

의존성 주입(Dependency Injection, DI)으로서, 외부에서 의존 객체를 주입함을 의미한다. 

의존성 주입(DI)의 의도는 객체의 생성과 사용의 관심을 분리하는 것 이는 가독성코드 재사용성을 높여준다. 

 

 

의존성 주입은 다음과 같은 문제를 해결한다고 한다.

  • 어떻게 애플리케이션이나 클래스가 객체의 생성 방식과 독립적일 수 있는가? 
  • 어떻게 객체의 생성 방식을 분리된 구성 파일에서 지정할 수 있는가? 
  • 어떻게 애플리케이션이 다른 구성을 지원할 수 있는가? 

마틴 파올러는 DI의 관한 의존성 주입 패턴 세 가지를 제안하였다. 

  • 생성자 주입 : 필요한 의존성을 모두 포함하는 클래스의 생성자를 만들고 그 생성자를 통해 의존성을 주입한다.
  • 세터(Setter)를 통한 주입 : 의존성을 입력받는 세터(Setter) 메서드를 만들고 이를 통해 의존성을 주입한다. 
  • 인터페이스(Interface)를 통한 주입 : 의존성을 주입하는 함수를 포함한 인터페이스를 작성하고 이 인터페이스를 구현하도록 함으로써 실행 시에 이를 통하여 의존성을 주입한다.

 

DI 장점은 다음과 같다. 

  • 상위 타입을 사용할 경우 의존 대상이 바뀌면 조립기(설정)만 변경하면 된다. 
  • 의존하는 객체 없이 대역 객체를 사용해서 테스트 가능 

 

DIP ( Dependency Inversion principle ) 

의존관계 역전 원칙 (DIP)는 소프트웨어 모듈들을 분리하는 특정 형식지칭한다. 

 

해당 원칙은 상위 계층(정책 결정)하위 계층(세부 사항)에 의존하는 전통적인 의존관계를 반전(역전)시킴으로써 상위 계층이 하위 계층의 구현으로부터 독립되게 할 수 있다는걸 의미한다.

 

즉, 해당 원칙은 상위 계층이 하위계층에 의존하면안되고, 저수준모듈은 고수준 모듈에서 정의한 추상 타입에 의존해야 한다.

 

그럼 이러한 DIP는 어떠한 장점을 가지고 있을까? 

  • 유연함을 높인다.
    • 고수준 모듈의 변경을 최소화하면서 저수준 모듈의 변경 유연함을 높인다

  • 위 그림을 보면 알 수 있듯, Controller에 대해 Interface를 두고, 해당 정책 및 기획이 바뀌었을 때 하위 계층에 대한 처리를 유연하게 바꾸는 것이 가능하다.

 

결론 

두 의존성 주입의 경우 DI는 위에서 아래, DIP는 상위와 하위 두 가지로 나눠 하위가 상위 계층으로 의존성을 주입함임을 느낄 수 있었다. 

회사든 이후 프로젝트 할당을 받았을 때 해당 기능에 대한 상위, 하위에 대한 분류를 한 후 조금 더 유연한 설계를 해야 함을 다시 한번 느낄 수 있던 계기였다.

반응형

관련글 더보기