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가 테스트에 왜 도움이 되나
대체 구현을 넣기 쉬워져서 진짜 외부 시스템 없이도 검증하기 쉬워지기 때문입니다.
Read Next
- 실전 객체 연결 방식은 의존성 주입 가이드와 가장 잘 이어집니다.
- SOLID 전체 흐름은 SOLID 가이드를 같이 보면 좋습니다.
심사 대기 중에는 광고 대신 관련 가이드를 먼저 보여줍니다.
먼저 읽어볼 가이드
검색 유입이 많은 핵심 글부터 이어서 보세요.
- 미들웨어 트러블슈팅 가이드: Redis vs RabbitMQ vs Kafka 개발자를 위한 미들웨어 트러블슈팅 허브 글입니다. Redis, RabbitMQ, Kafka 중 어떤 증상부터 먼저 봐야 하는지와 어떤 문제 패턴이 각 시스템에 가까운지 정리합니다.
- Kubernetes CrashLoopBackOff: 먼저 볼 것들 startup failure, probe, config, resource limit 관점에서 CrashLoopBackOff를 어떻게 나눠서 봐야 하는지 정리한 가이드입니다.
- Kafka consumer lag가 계속 늘 때: 트러블슈팅 가이드 Kafka consumer lag가 계속 늘어날 때 무엇부터 봐야 하는지 정리합니다. poll 주기, 처리 속도, rebalance, consumer 설정까지 실전 기준으로 다룹니다.
- Kafka Rebalancing Too Often 가이드 Kafka consumer group에서 rebalance가 너무 자주 일어날 때 membership flapping, poll timing, protocol, assignment churn을 어떤 순서로 봐야 하는지 설명하는 실전 가이드입니다.
- Docker container가 계속 재시작될 때: 먼저 확인할 것들 exit code, command failure, environment mistake, health check 관점에서 Docker restart loop를 푸는 실전 가이드입니다.
심사 대기 중에는 광고 대신 관련 가이드를 먼저 보여줍니다.