평소처럼 코드를 작성하다가 다음코드를 읽고 의문이 들었다
private final PaymentService service;
이 패턴이 DIP를 고려한 코드라는 건
무적영한킴의 강의를 통해 알고 있었다.
하지만 막상 DIP가 뭐였지?라고 생각하니
명확하게 설명할 수 없었다.
그래서 이 코드가 왜 DIP와 연결 되는지
실제로 어떤 문제를 해결해주는지 정리하려 한다.
만약 코드가 다음과 같으면 어떤 문제가 생길까
private final joinTheMilitary 입대 = new 해군입대();
이 구조에서 클래스는
“입대한다” 라는 정책이 아니라
“해군으로 입대 한다”는 세부사항까지 결정하게 된다.
당장 동작하는데 문제는 없지만
요구사항이 육군으로 바뀌는 순간
클래스의 코드를 바꿔야 하는 문제가 생긴다
이 문제를 해결하기 위해 등장한 원칙이 DIP다
고수준/저수준 이라는 용어를 들으면 상하 관계가 있다는건 알겠지만
어떻게 상하로 나뉘는지 직관적으로 이해하기 어려웠다
고수준 모듈
→ 무엇을 할 것인가
정책,규칙,흐름
저수준 모듈
→ 어떻게 할 것인가
세부사항을 의미한다
DIP(Dependency Inversion Principle)는
고수준 모듈은 저수준 모듈에 의존하면 안 된다.
둘 다 추상화에 의존해야된다
라는 의미이다
다시 코드로 돌아가서 본다면
private final joinTheMilitary 입대 = new 해군으로입대();
위의 코드는 고수준(입대)이 저수준(해군)을 의존하고 있으므로
DIP원칙을 위반한다
반면에
private final PaymentService service;
이 구조에서 Controller는
Service 추상화에 의존하고있다.
그리고 구체적으로 어떤 내용이 들어있는지도 모른다
클래스는 구현체가 무엇인지 알 지 못한다.
DIP(Dependency Inversion Principle) 에서
실제로 뒤집히는 건 의존성의 방향이다
private final joinTheMilitary 입대 = new 해군입대();
이 코드는
입대정책 → 해군입대
고수준 저수준
정책이 구현을 의존하고 있다
DIP를 적용하면
public class joinTheMilitary {
private final 입대인터페이스 입대;
(인터페이스) (변수이름)
}
public class 해군_입대_클래스 implements 입대인터페이스{
}
joinTheMilitary -> 입대인터페이스 <- 해군_입대_클래스
(정책) (추상화) (구현)
고수준과 저수준이
모두 추상화를 의존하게 된다.
그래서 Dependency Inversion이다.
예시를 들어서 설명해주니깐 훨씬 이해가 쉬운 것 같아요!!