반응형
DIP(역전 의존 원칙)이란?
- 서비스가 특정 시스템에 의존성을 가지게 되면 서비스 자체만으로 테스트 수행이 어렵고 종속되는 시스템에 따라 서비스의 코드가 지속적으로 변경될 여지가 있다.
- 저수준 모델이 고수준 모델에 의존하도록 바꾸는 것
- 변경에 유연하고 테스트가 쉬움
- 핵심은 의존 관계를 맺을 때 변화하기 쉬운 것에 의존하기보다는, 변화하지 않는 것에 의존 해야한다.
예시
신용카드 클래스를 만든다고 했을때
신용카드에는 여러가지 종류에 은행이 있을것이다.
class ShinhanCard { // 신한카드
public void pay() { // 결제
...
}
public void pause() { // 카드정지
...
}
}
class HyunDaiCard { // 현대카드
public void pay() { // 결제
...
}
public void pause() { // 카드정지
...
}
}
class PayService {
private ShinhanCard shinhanCard;
private HyunDaiCard hyunDaiCard;
public PayService(ShinhanCard shinhanCard) {
this.shinhanCard = shinhanCard;
}
public PayService(HyunDaiCard hyunDaiCard) {
this.hyunDaiCard = hyunDaiCard;
}
public void shinhanCardPay() { // 신한카드 결제
shinhanCard.pay();
}
public void hyunDaiCardPay() { // 현대카드 결제
hyunDaiCard.pay();
}
...
}
위 코드 처럼 여러가지 카드 클래스를 가지고 Service단에서 사용하면 카드 클래스마다 모든 기능을 만들어줘야 한다.
고수준 모델인 PayService가 각 카드 클래스들에게 의존하고 있는 모습이다.
카드 클래스가 새로 만들어질때마다 생성자도 하나씩 늘어나야 한다.
interface Card {
void pay(); // 결제
void pause(); // 카드정지
}
class ShinhanCard implements Card { // 신한카드
@Override
public void pay() { // 결제
...
}
@Override
public void pause() { // 카드정지
...
}
}
class HyunDaiCard implements Card { // 현대카드
@Override
public void pay() { // 결제
...
}
@Override
public void pause() { // 카드정지
...
}
}
class PayService {
private Card card;
public PayService(Card card) {
this.card = card;
}
public void pay() {
card.pay();
}
...
}
위 코드처럼 Interface로 관계를 느슨하게 만들어 준다면 카드 클래스가 새로 만들어지더라도 PayService는 수정 할 필요가 없어진다.
저 수준인 Card Interface가 PayService에 의존하고 있는 모습이다.
반응형
'DDD' 카테고리의 다른 글
애그리거트(Aggregate) 트랜잭션 관리 (0) | 2021.09.15 |
---|---|
애그리거트(Aggregate)간에 참조 및 영속성 전파 (0) | 2021.09.15 |
AttributeConverter를 이용한 밸류 매핑 처리 (0) | 2021.09.14 |
@SecondaryTable을 이용한 밸류 매핑 설정 (0) | 2021.09.14 |
엔티티(Entity)와 밸류(Value)란? (0) | 2021.09.14 |