Spring
[Core] 스프링 핵심 원리 예제 - 주문 할인 도메인 개발
sangyunpark
2023. 9. 1. 14:57
할인 정책 인터페이스
package sangyunpark.core.discount;
import sangyunpark.core.member.Member;
public interface DiscountPolicy {
// @return 할인대상 금액
int discount(Member member, int price); // 할인 정책
}
정액 할인 정책 구현체
package sangyunpark.core.discount;
import sangyunpark.core.member.Grade;
import sangyunpark.core.member.Member;
public class FixDiscountPolicy implements DiscountPolicy {
private final int discountFixAmount = 1000; // 1000원 할인
@Override
public int discount(Member member, int price) {
if(member.getGrade() == Grade.VIP){
return discountFixAmount;
}else {
return 0;
}
}
}
서비스 개발 interface 개발
package sangyunpark.core.order;
import org.springframework.stereotype.Service;
@Service
public interface OrderService {
Order createOrder(Long memberId, String itemName, int itemPrice);
}
서비스 개발 구현
package sangyunpark.core.order;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import sangyunpark.core.annotation.MainDiscountPolicy;
import sangyunpark.core.discount.DiscountPolicy;
import sangyunpark.core.member.Member;
import sangyunpark.core.member.MemberRepository;
@Component
public class OrderServiceImpl implements OrderService {
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
@Autowired
public OrderServiceImpl(MemberRepository memberRepository, @MainDiscountPolicy DiscountPolicy discountPolicy){
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
@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);
}
public MemberRepository getMemberRepository() {
return memberRepository;
}
}