다음으로 주문과 할인 도메인을 작성하겠습니다.
요구사항
- 회원은 상품을 주문
- 회원 등급에 따라 할인을 받을 수 있다.
- 할인은 모든 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);
}
}
'Spring > Spring 핵심 원리' 카테고리의 다른 글
스프링 컨테이너와 스프링 빈 (0) | 2023.01.20 |
---|---|
예제 만들기 - AppConfig 생성 (0) | 2023.01.20 |
객체 지향과 스프링 - 좋은 객체 지향 설계의 5가지 원칙 (0) | 2023.01.16 |
객체 지향과 스프링 - 좋은 객체 지향 프로그램이란 (0) | 2023.01.16 |
예제 만들기 - 회원 도메인 설계 (0) | 2023.01.14 |