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