본문 바로가기
백엔드/스프링

[Inflearn] 새로운 할인 정책 개발

by dustnn 2025. 2. 2.

새로운 할인 정책을 확장해볼 거다.

 

원래 할인 정책이 FixDiscountPolicy() 를 사용하는 고정 금액 할인 정책이었다면,

개발자가 할인 정책을 RateDiscountPolicy(), 정률%할인 정책으로 변경하고 싶다고 가정해볼 거다.

 

 

 

 

<RateDiscountPolicy>

package hello.core.discount;

import hello.core.member.Grade;
import hello.core.member.Member;

public class RateDiscountPolicy implements DiscountPolicy{

    private int discountPercent = 10; // 10% 할인

    @Override
    public int discount(Member member, int price) {
        if (member.getGrade() == Grade.VIP){
            return price * discountPercent / 100;
        } else {
            return 0;
        }
    }
}

 

 

 

<RateDiscountPolicyTest>

package hello.core.discount;

import hello.core.member.Grade;
import hello.core.member.Member;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.*;

class RateDiscountPolicyTest {

    RateDiscountPolicy discountPolicy = new RateDiscountPolicy();

    @Test
    @DisplayName("VIP는 10% 할인이 적용되어야 한다")
    void vip_o(){
        // give
        Member member = new Member(1l, "memberVIP", Grade.VIP);
        // when
        int discount = discountPolicy.discount(member, 10000);
        // than
        Assertions.assertThat(discount).isEqualTo(1000);
    }

    @Test
    @DisplayName("VIP가 아니면 할인이 적용되지 않아야 한다")
    void vip_X(){
        // give
        Member member = new Member(1l, "memberBASIC", Grade.BASIC);
        // when
        int discount = discountPolicy.discount(member, 10000);
        // than
        Assertions.assertThat(discount).isEqualTo(0);
    }
}

 

이제 FixDiscountPolicy() 에서 RateDiscountPolicy() 로 변경해볼 건데,

클라이언트 코드인 OrderServiceImpl() 코드를 다음과 같이 고쳐야 한다.

 

 

<OrderServiceImpl>

package hello.core.order;

import hello.core.discount.DiscountPolicy;
import hello.core.discount.FixDiscountPolicy;
import hello.core.discount.RateDiscountPolicy;
import hello.core.member.Member;
import hello.core.member.MemberRepository;
import hello.core.member.MemberService;
import hello.core.member.MemoryMemberRepository;

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);
    }
}