[Spring JPA 실습 #5] 주문 주문상품 엔티티 개발
- 📚 Spring/Spring JPA 실습
- 2021. 3. 6. 17:33
Order
package com.jpabook.domain;
import lombok.Getter;
import lombok.Setter;
import javax.persistence.*;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
@Entity
@Table(name = "orders")
@Setter @Getter
public class Order {
@Id @GeneratedValue
@Column(name="order_id")
private Long id;
@ManyToOne
@JoinColumn(name = "member_id")
private Member member;
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
private List<OrderItem> orderItems = new ArrayList<>();
// OneToOne, ManyToOne은 LAZY로 모두 설저해줘야 한다
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "delivery_id")
private Delivery delivery;
private LocalDateTime orderDate; //주문시간
@Enumerated(EnumType.STRING)
private OrderStatus status; //주문상태 [ORDER, CANCEL]
/*==연관관계 메서드==*/
public void setMember(Member member) {
this.member = member;
member.getOrders().add(this);
}
public void addOrderItem(OrderItem orderItem) {
orderItems.add(orderItem);
orderItem.setOrder(this);
}
public void setDelivery(Delivery delivery) {
this.delivery = delivery;
delivery.setOrder(this);
}
/* 생성 메서드 */
public static Order createOrder(Member member, Delivery delivery, OrderItem... orderItems) {
Order order = new Order();
order.setMember(member);
order.setDelivery(delivery);
for(OrderItem orderitem : orderItems) {
order.addOrderItem(orderitem);
}
order.setStatus(OrderStatus.ORDER);
order.setOrderDate(LocalDateTime.now()); //현재 시간으로 초기화
return order;
}
/* === 비즈니스 로직 === */
/*
* 주문취소
*/
public void cancel() {
if(delivery.getStatus() == DeliveryStatus.COMP) {
throw new IllegalStateException("이미 배송완료된 상품은 취소가 불가능합니다.");
}
this.setStatus(OrderStatus.CANCEL);
for(OrderItem orderitem : orderItems) {
orderitem.cancel();
}
}
// 전체 주문가격 조회 //
public int getTotalPrice() {
int totalPrice = 0;
for(OrderItem orderItem : orderItems) {
totalPrice += orderItem.getTotalPrice();
}
// 람다로 간략하게
//int totalPrice = orderItems.stream().mapToInt(OrderItem::getTotalPrice).sum();
return totalPrice;
}
}
OrderItem
package com.jpabook.domain;
import com.jpabook.domain.item.Item;
import lombok.Getter;
import lombok.Setter;
import javax.persistence.*;
@Entity
@Setter @Getter
public class OrderItem {
@Id @GeneratedValue
@Column(name = "order_item_id")
private Long id;
@ManyToOne
@JoinColumn(name = "item_id")
private Item item;
@ManyToOne
@JoinColumn(name = "order_id")
private Order order;
private int orderPrice; //주문가격
private int count; //주문수량
//== 생성 메서드 == //
public static OrderItem createOrderItem(Item item, int orderPrice, int count) {
OrderItem orderItem = new OrderItem();
orderItem.setItem(item);
orderItem.setOrderPrice(orderPrice);
orderItem.setCount(count);
item.removeStock(count); // 원래 재고에서 빼준다.
return orderItem;
}
// == 비즈니스 로직 == //
/**
* 재고수량은 원복해준다.
*/
public void cancel() {
getItem().addStock(count);
}
/**
* 주문상품 전체 가격 조회
* @return
*/
public int getTotalPrice() {
return getOrderPrice() * count;
}
}
'📚 Spring > Spring JPA 실습' 카테고리의 다른 글
[Spring JPA 실습 #7] 주문 서비스 테스트 (0) | 2021.03.07 |
---|---|
[Spring JPA 실습 #6] 주문 서비스 개발 (0) | 2021.03.07 |
[Spring JPA 실습 #4] 상품(Item) Repository 개발 (0) | 2021.03.06 |
[Spring JPA 실습 #3] 회원 기능 테스트 (0) | 2021.03.05 |
[Spring JPA 실습 #2] 회원가입 Repository (0) | 2021.03.05 |