프로젝트 - 4주차(DIP)

YoungSun·2026년 1월 28일

DIP

평소처럼 코드를 작성하다가 다음코드를 읽고 의문이 들었다

private final PaymentService service;

이 패턴이 DIP를 고려한 코드라는 건

무적영한킴의 강의를 통해 알고 있었다.

하지만 막상 DIP가 뭐였지?라고 생각하니

명확하게 설명할 수 없었다.

그래서 이 코드가 왜 DIP와 연결 되는지

실제로 어떤 문제를 해결해주는지 정리하려 한다.

이 코드가 자연스럽게 쓰이게 된 이유

만약 코드가 다음과 같으면 어떤 문제가 생길까

private final  joinTheMilitary 입대 = new 해군입대();

이 구조에서 클래스는

“입대한다” 라는 정책이 아니라

“해군으로 입대 한다”는 세부사항까지 결정하게 된다.

당장 동작하는데 문제는 없지만

요구사항이 육군으로 바뀌는 순간

클래스의 코드를 바꿔야 하는 문제가 생긴다

이 문제를 해결하기 위해 등장한 원칙이 DIP다

고수준 저수준 모듈

고수준/저수준 이라는 용어를 들으면 상하 관계가 있다는건 알겠지만

어떻게 상하로 나뉘는지 직관적으로 이해하기 어려웠다

고수준 모듈

무엇을 할 것인가

정책,규칙,흐름

저수준 모듈

어떻게 할 것인가

세부사항을 의미한다

그래서 DIP란?

DIP(Dependency Inversion Principle)는

고수준 모듈은 저수준 모듈에 의존하면 안 된다.

둘 다 추상화에 의존해야된다

라는 의미이다

다시 코드로 돌아가서 본다면

private final  joinTheMilitary 입대 = new 해군으로입대();

위의 코드는 고수준(입대)이 저수준(해군)을 의존하고 있으므로

DIP원칙을 위반한다

반면에

private final PaymentService service;

이 구조에서 Controller는

Service 추상화에 의존하고있다.

그리고 구체적으로 어떤 내용이 들어있는지도 모른다

클래스는 구현체가 무엇인지 알 지 못한다.

왜 Dependency Inversion 인가

DIP(Dependency Inversion Principle) 에서

실제로 뒤집히는 건 의존성의 방향이다

	private final  joinTheMilitary 입대 = new 해군입대();

이 코드는

입대정책  →  해군입대
고수준       저수준

정책이 구현을 의존하고 있다

DIP를 적용하면

public class joinTheMilitary {
    private final   입대인터페이스      입대;
			        (인터페이스)     (변수이름)
}
public class 해군_입대_클래스 implements 입대인터페이스{
}
joinTheMilitary -> 입대인터페이스  <- 해군_입대_클래스
(정책)            (추상화)         (구현)

고수준과 저수준이

모두 추상화를 의존하게 된다.

그래서 Dependency Inversion이다.

1개의 댓글

comment-user-thumbnail
2026년 1월 29일

예시를 들어서 설명해주니깐 훨씬 이해가 쉬운 것 같아요!!

답글 달기