객체 지향 원리 적용(1)
💡객체지향의 원리
스프링을 사용하지 않고 순수 자바코드로만 개발을하면 객체지향의 원리중 OCP(Open Closed Principle)개방 폐쇄 원칙과 DIP(Dependency Inversion Principle)의존 역전 원칙을 지키지 못하게된다. 할인정책 변경을 위한 코드를 살펴보고 스프링 프레임워크를 사용해 리팩토링해본다.
💡할인정책의 변경
FixDiscountPolicy를 RateDiscountPolicy로 변경한다
DiscountPolicy 인터페이스
public interface DiscountPolicy {
int discount(Member member, int price);
}
RateDiscountPolicy 클래스
public class RateDiscountPolicy implements DiscountPolicy {
private int discountPercent = 10;
@Override
public int discount(Member member, int price) {
if(member.getGrade() == Grade.VIP) {
return price * discountPercent / 100;
} else {
return 0;
}
}
}
할인정책을 변경하려면 OrderServiceImpl에서 코드를 수정해야 한다.
public class OrderServiceImpl implements OrderService{
private final MemberRepository memberRepository = new MemoryMemberRepository();
//private final DiscountPolicy discountPolicy = new FixDiscountPolicy();
private final DiscountPolicy discountPolicy = new RateDiscountPolicy();
@Override
public Order createOrder(Long memberId, String itemName, int itemPrice) {
Member member = memberRepository.findById(memberId);
int discountPrice = discountPolicy.discount(member,itemPrice);
return new Order(memberId, itemName, itemPrice, discountPrice);
}
}
💡객체 지향 원칙 위반
의존 역전 원칙(DIP) 위반
🎈 의존 역전 원칙이란 의존관계는 변화가 쉽고 자주 변화하는 것 보다는 변화가 거의 없는 것에 의존해야 한다는 원칙을 말한다.
OrderServiceImpl 클래스는 인터페이스 뿐만 아니라 구현 객체에도 의존하고 있기 때문에 의존 역전 원칙에 위반한다. 객체지향의 원칙을 잘 지킨 코드는 추상화에 의존한다.
개방 폐쇄 원칙(OCP) 위반
🎈 개방 폐쇄 원칙이란 확장에 대해 열려 있어야 하고 수정에 대해서는 닫혀 있어야 한다는 프로그래밍 원칙을 말한다.
할인정책을 변경하려면 OrderServiceImpl의 소스코드를 변경해야 하기 때문에 개방 폐쇄 원칙에 위반한다. 그렇다면 이 문제를 어떻게 해결할 수 있을까?
인터페이스에만 의존하도록 코드를 변경한다
public class OrderServiceImpl implements OrderService{
private DiscountPolicy discountPolicy;
}
코드를 변경한 후 테스트 해보면 할당된 구현체가 없기 때문에 null pointer exception 에러가 발생한다. 그렇다면 어떻게 DIP를 지키며 구현 객체를 만들 수 있을까?
해결방안 : OrderServiceImpl의 discountPolicy에 구현 객체를 대신 생성해서 주입해주는 무언가가 있으면 DIP를 지킬 수 있는 코드가 된다. 다음편에서 자세히 알아본다.
이 글은 김영한님의 스프링 핵심 원리 강의를 듣고 정리한 내용입니다.
Author And Source
이 문제에 관하여(객체 지향 원리 적용(1)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@jooog/객체-지향-원리-적용저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)