객체지향 설계 원칙(SOLID) 중 DIP 의존 역전 원칙에 대해서 알아보겠습니다.
Dependency Inversion Principle
의미
"추상화에 의존해야 하며, 구체화에 의존하면 안된다."
- 고수준(상위) 모듈은 저수준(하위) 모듈의 구현에 의존해서는 안된다.
- 저수준(하위) 모듈이 고수준(상위) 모듈에 정의한 추상 타입(interface)에 의존해야 한다.
쉽게 말해 자신보다 변하기 쉬운 것에 의존하면 안된다는 의미입니다.
모듈의 수준
고수준 모듈 (응용 영역, 도메인 영역) | 저수준 모듈 (Infrastructure) |
고객 맞춤 가격 계산 1. 고객 정보 조회 2. 고객의 등급 및 프로모션 기반으로 고객 맞춤 가격 계산 |
1. jpa 로 db 조회 |
- 고수준 모듈 : 의미 있는 단일 기능을 제공하는 모듈으로, 실제로 사용하는 것과 근접한 것입니다.
- 비즈니스 로직을 처리하는 Service 계층
- 저수준 모듈 : 하위 기능을 실제로 구현한 것으로, 각각의 동작을 의미합니다.
- 주로 DAO 클래스, 파일 처리, Notifier 등등 Infrastructure 영역
고수준 모듈이 제대로 동작하려면 저수준 모듈을 사용해야 합니다.
의존 역전 원칙이란?
고수준 모듈이 저수준 모듈에 의존하게 되면, 구현 변경과 테스트가 어려운 문제가 생기게 됩니다. 예를 들어, 데이터베이스를 사용하는 프레임워크로 Mybatis를 사용하다가, JPA로 변경하고 싶을 때, 해당 저수준 모듈(mybatis)을 의존하고 있는 모든 곳에서 구현 변경이 필요해집니다.
DIP는 이러한 문제를 해결하기 위해 추상화한 인터페이스로 저수준 모듈이 고수준 모듈에 의존하도록 했습니다.
원래는 고수준이 모듈이 저수준 모듈을 사용하려면 고수준 모듈이 저수준 모듈에 의존해야 하는데, 반대로 저수준 모듈이 고수준 모듈에 의존하도록 했으므로 의존 역전 원칙인 것입니다.
DIP를 단순히 인터페이스와 구현 클래스를 분리하는 것으로 잘못 받아들일 수 있습니다. 단순히 인터페이스를 저수준 모듈에서 추출하게 되면 여전히 고수준 모듈이 저수준 모듈에 의존하고 있는 것입니다.
즉, DIP를 적용할 때 하위 기능을 추상화한 인터페이스는 고수준 모듈 관점에서 도출해야 합니다.
'개발' 카테고리의 다른 글
Singleton Pattern (4) | 2024.09.23 |
---|---|
DDD - Aggregate (2) | 2024.09.22 |
DDD - 도메인 모델링 (0) | 2024.09.20 |
DDD - 도메인이란? (1) | 2024.09.19 |
TDD (테스트 주도 개발) (1) | 2024.09.18 |