DIP 가이드: 의존성 역전 원칙은 왜 중요한가
Dev

DIP 가이드: 의존성 역전 원칙은 왜 중요한가


SOLID에서 DIP, 의존성 역전 원칙은 객체 지향 설계가 왜 추상화와 의존성 관리에 집착하는지 잘 보여주는 원칙입니다. 처음엔 말이 어렵지만, 실제로는 “고수준 정책이 구체 구현에 너무 강하게 묶이지 않게 하자”는 방향에 가깝습니다.

이 글에서는 아래 내용을 정리합니다.

  • DIP가 무엇인지
  • 왜 구체 구현보다 추상에 의존하는 것이 좋은지
  • DI와는 어떤 관계가 있는지

핵심은 DIP는 구현을 감추기 위한 테크닉이 아니라, 변경 가능성이 큰 구체 코드에 시스템 중심 로직이 끌려다니지 않도록 만드는 설계 원칙이라는 점입니다.

DIP란 무엇인가

아주 짧게 말하면:

  • 고수준 모듈은 저수준 모듈에 직접 의존하지 않고
  • 둘 다 추상에 의존하도록 하자

는 원칙입니다.

즉, 비즈니스 규칙 같은 핵심 로직이 특정 DB, 특정 API 클라이언트, 특정 알림 구현에 강하게 묶이지 않도록 하자는 뜻입니다.

왜 중요한가

구체 구현에 직접 의존하면:

  • 구현을 바꾸기 어렵고
  • 테스트가 불편해지며
  • 핵심 로직이 인프라 세부사항에 끌려갑니다

반대로 추상에 의존하면 구현을 교체하거나 대체하기가 훨씬 쉬워집니다.

DIP와 DI는 같은가

같지는 않지만 자주 함께 갑니다.

  • DIP: 설계 원칙
  • DI: 그 원칙을 코드와 객체 생성 방식에 녹이는 실용적 방법

즉, DIP가 방향이라면 DI는 구현 도구에 가깝습니다.

입문자는 어떻게 이해하면 좋을까

아래 질문이 도움이 됩니다.

  • 이 서비스가 특정 구현체 이름을 너무 많이 알고 있는가
  • 테스트용 대체 구현을 넣기 쉬운가
  • 핵심 로직이 인프라 세부 구현에 끌려가고 있지는 않은가

이 질문이 바로 DIP 감각으로 이어집니다.

자주 하는 오해

1. 인터페이스만 만들면 DIP다

중요한 것은 추상이 실제로 결합도를 낮추고 있는가입니다.

2. DIP는 무조건 복잡한 구조를 만든다

과하게 쓰면 그럴 수 있지만, 적절히 쓰면 오히려 변경 경계를 명확하게 합니다.

3. 작은 프로젝트에는 필요 없다

항상 큰 추상화가 필요하진 않지만, 외부 의존성이 섞일수록 DIP 감각은 도움이 됩니다.

FAQ

Q. DIP는 어디에 먼저 적용해보면 좋을까

DB 접근, 외부 API, 파일 저장, 알림 발송처럼 교체 가능성이 있는 부분이 좋습니다.

Q. DI를 쓰면 자동으로 DIP를 지키게 되나

항상 그런 것은 아닙니다. 추상 경계가 어색하면 DI만 써도 결합이 여전히 강할 수 있습니다.

Q. DIP가 테스트에 왜 도움이 되나

대체 구현을 넣기 쉬워져서 진짜 외부 시스템 없이도 검증하기 쉬워지기 때문입니다.

먼저 읽어볼 가이드

검색 유입이 많은 핵심 글부터 이어서 보세요.