하나씩 차근차근
article thumbnail

다음으로 주문과 할인 도메인을 작성하겠습니다.

 

요구사항

  • 회원은 상품을 주문
  • 회원 등급에 따라 할인을 받을 수 있다.
  • 할인은 모든 VIP 를 1000원 할인해주는 할인과 주문 금액당 할인을 해주는 두 가지 방법

 

주문 엔티티

다음과 같이 주문 엔티티를 작성하기 위해 order 패키지를 만들어 그 안에 생성합니다.

package hello.core.order;

public class Order {

	private Long memberId;
	private String itemName;
	private int itemPrice;
	private int discountPrice;
	
	public Order(Long memberId, String itemName, int itemPrice, int discountPrice) {
		this.memberId = memberId;
		this.itemName = itemName;
		this.itemPrice = itemPrice;
		this.discountPrice = discountPrice;
	}
	
	public Long getMemberId() {
		return memberId;
	}
	
	public void setMemberId(Long memberId) {
		this.memberId = memberId;
	}
	
	public String getItemName() {
		return itemName;
	}
	
	public void setItemName(String itemName) {
		this.itemName = itemName;
	}
	
	public int getItemPrice() {
		return itemPrice;
	}
	
	public void setItemPrice(int itemPrice) {
		this.itemPrice = itemPrice;
	}
	public int getDiscountPrice() {
		return discountPrice;
	}
	
	public void setDiscountPrice(int discountPrice) {
		this.discountPrice = discountPrice;
	}

	@Override
	public String toString() {
		return "Order [memberId=" + memberId + ", itemName=" + itemName + ", itemPrice=" + itemPrice
				+ ", discountPrice=" + discountPrice + "]";
	}
}

 

할인 정책 구현

할인 정책은 앞에서 만든 회원 도메인처럼 인터페이스와 구현체로 나눠서 작성합니다.

먼저 할인 정책 인터페이스를 작성합니다.

package hello.core.order;

import hello.core.member.Member;

public interface DiscountPolicy {

	int discount(Member member, int price);
}

다음으로 할인 정책 인터페이스를 구현한 구현체를 만들겠습니다.

구현체는 1000원을 할인해주는 방법 (FixdiscountPolicy) 과 금액에 따른 할인 (RateDiscountPolicy) 을 해주는

두가지 구현체가 있습니다.

package hello.core.order;

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

public class FixDiscountPolicy implements DiscountPolicy{

	private int discountFixAmount = 1000;
	
	@Override
	public int discount(Member member, int price) {
		// TODO Auto-generated method stub
		
		if(member.getGrade() == Grade.VIP) {
			return discountFixAmount;
		} else {
			return 0;
		}
	}

}

 

package hello.core.order;

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

public class RateDiscountPolicy implements DiscountPolicy{

	private int discountPercent = 10;
	
	@Override
	public int discount(Member member, int price) {
		// TODO Auto-generated method stub
		
		if(member.getGrade() == Grade.VIP) {
			return price * discountPercent / 100;
		} else {
			return 0;
		}
	}

}

 

주문 서비스

주문 서비스는 주문 생성 요청이 오면 회원 정보를 조회하고 할인 정책을 적용해서 주문 객체를 반환합니다.

이때 할인은 1000원을 할인해주는 FixDiscountPolicy 를 사용합니다.

package hello.core.order;

public interface OrderService {

	Order createOrder(Long memberId, String itemName, int itemPrice);
}
package hello.core.order;

import hello.core.member.Member;
import hello.core.member.MemberRepository;
import hello.core.member.MemoryMemberRepository;

public class OrderServiceImpl implements OrderService{

	private final MemberRepository memberRepository = new MemoryMemberRepository();
	
	private final DiscountPolicy discountPolicy = new FixDiscountPolicy();

	@Override
	public Order createOrder(Long memberId, String itemName, int itemPrice) {
		// TODO Auto-generated method stub
		
		Member member = memberRepository.findById(memberId);
		int discountPrice = discountPolicy.discount(member, itemPrice);
		
		return new Order(memberId, itemName, itemPrice, discountPrice);
	}
	
	
}

 

profile

하나씩 차근차근

@jeehwan_lee

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!