객체 지향 원리 적용(1)

jooog·2022년 3월 29일
0

💡객체지향의 원리

스프링을 사용하지 않고 순수 자바코드로만 개발을하면 객체지향의 원리중 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를 지킬 수 있는 코드가 된다. 다음편에서 자세히 알아본다.

이 글은 김영한님의 스프링 핵심 원리 강의를 듣고 정리한 내용입니다.

0개의 댓글