새로운 할인 정책을 확장해볼 거다.
원래 할인 정책이 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);
}
}
'백엔드 > 스프링' 카테고리의 다른 글
[Inflearn] AppConfig 리팩터링(DIP 만족) (0) | 2025.02.23 |
---|---|
[Inflearn] 새로운 할인 정책 적용의 문제점 & 해결방안(관심사 분리) (SRP 만족) (0) | 2025.02.07 |
[Inflearn] 주문과 할인 도메인 개발 (0) | 2025.01.30 |
[Inflearn] 주문과 할인 도메인 설계 (0) | 2025.01.30 |
[Inflearn] 회원 도메인 개발 (0) | 2025.01.29 |