예제를 통한 OCP, DIP 위반 (1)

Gyuhan Park·2022년 9월 7일
0

spring

목록 보기
14/18

객체지향 설계

객체지향 설계 원칙을 준수하면서 유연한 설계가 가능하도록 예제를 만들어 보자.
역할과 구현을 명확히 분리해서 설계하는 것이 중요하다. 자유롭게 구현 객체가 인터페이스를 implements해서 조립할 수 있게 설계하였다.

인터페이스와 구현체들을 다이어그램으로 표현한 것이다. 클라이언트 코드인 OrderServiceImpl가 각각의 interface를 의존하는 관계다.

OCP, DIP 위반

기획자가 생각을 바꿔 고정할인정책 대신 금액에 따른 정률할인정책을 적용하자고 한다. 우리는 객체지향 설계 원칙을 준수했으니 짜증은 났지만 알겠다고 했다. 근데 문제가 생겼다. 괜히 알겠다고 했나?

[잘한 점]
역할과 구현을 명확하게 분리
다형성도 활용하고, 인터페이스와 구현 객체 분리

[문제점]
추상(인터페이스) 뿐만 아니라 구체(구현) 클래스에도 의존하고 있다.
=> DIP 위반
지금 코드는 기능을 확장해서 변경하면, 클라이언트 코드에 영향을 준다.
=> OCP 위반

??? : 구체 클래스에도 의존하고 있는 게 문제라면 인터페이스만 의존하면 되는 거 아님?

public class OrderServiceImpl implements OrderService {
	// private DiscountPolicy discountPolicy = new RateDiscountPolicy();
  	private DiscountPolicy discountPolicy;
}

인터페이스에만 의존하면서 DIP 원칙은 지키고 있다. 근데 이러면 discountPolicy에는 메소드에 대한 코드가 없어서 NullPointException이 발생한다.

그럼 대체 어떻게 하라고?

이 문제를 해결하려면 누군가가 클라이언트인 OrderServiceImplDiscountPolicy 의 구현 객체를 대신 생성하고 주입해주어야 한다.
=> DI(Dependency Injection)

[참고] 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

profile
단단한 프론트엔드 개발자가 되고 싶은

0개의 댓글