Record: 2022.11.21 /
쇼핑몰 예제 실습에서 필요한 요구사항은 다음과 같다.
위 요구사항을 보면, DB나 할인정책은 변경될 수 있다. 다형성을 생각하여 인터페이스로 개발을 진행해보자!
할인정책을 변경하기 위해서는 현재 클라이언트의 코드를 변경해주어야 한다. 그 예제는 아래와 같다.
// private final DiscountPolicy discountPolicy = new FixDiscountPolicy(); → 변경전
private final DiscountPolicy discountPolicy = new RateDiscountPolicy(); → 변경후
DiscountPolicy
FixDiscountPolicy
, RateDiscountPolicy
OCP를 위반
한다.자! 이제 OCP를 위반했기 때문에 해결방안을 생각해보자. 해결방안은 다음과 같다.
OrderServiceImpl
은 DiscountPolicy
의 인터페이스 뿐만 아니라 구체 클래스도 함께 의존한다. 그래서 구체 클래스를 변경할 때 클라이언트 코드도 함께 변경해야한다.코드로 표현하자면 다음과 같다.
private final DiscountPolicy discountPolicy;
위 방식대로 메서드를 호출할 경우 Null포인트 Exception이 발생할 것이다. 왜? → 그 이유는 객체를 할당해주지 않았기 때문이다.
Config파일을 하나 생성하여 구현 객체의 생성을 하나의 클래스로 관리하자
public class AppConfig {
public MemberService memberService() {
return new MemberServiceImpl(new MemoryMemberRepository());
}
public OrderService orderService() {
return new OrderServiceImpl(new MemoryMemberRepository(), new FixDiscountPolicy());
}
}
위 코드를 통해 DIP를 만족할 수 있다.