728x90
주문 엔티티, 비즈니스 로직 개발
@Entity
@Table(name = "orders")
@Getter
@Setter
public class Order {
@Id
@GeneratedValue
@Column(name = "order_id")
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "member_id")
private Member member;//연관관계의 주인
@OneToMany(mappedBy = "order",cascade = CascadeType.ALL)
private List<OrderItem> orderItems = new ArrayList<>();
@OneToOne(fetch = FetchType.LAZY,cascade = CascadeType.ALL)
@JoinColumn(name = "delivery_id")
private Delivery delivery;//외래키를 아무대나 넣어줘도 되지만, 자주 참조될거같은 Order 에 두는게 편하다
//hibernate 가 알아서 시간타입을 메핑 해준다.
private LocalDateTime orderDate;
@Enumerated(EnumType.STRING)
private OrderStatus status;//주문상태 [ ORDER,CANCLE]
//==연관관계 메소드==//
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();//OrderItem도 캔슬이 되야된다.
}
}
//==생성 메소드==/
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 int getTotalPrice(){
int totalPrice = 0;
for(OrderItem orderItem : orderItems){
totalPrice += orderItem.getTotalPrice();
}
return totalPrice;
}
}
- createOrder 메서드
- 생성 메소드를 만들어 Order를 생성하기 위해 연관된 것들을 다 세팅해 준다.
- 후에 생성로직이 변경되어도 이 메서드만 변경하면 된다.
- 주문 상태를 ORDER로 생성한뒤, 주문시간을 현재 시간으로 세팅한다.
- cancel 메소드
- 주문 취소 메서드
- 배송 완료된 건에 대해서는 에러를 발생시킨다.
- 주문이 취소될 경우 주문 상태를 CANCEL로 변경시킨 뒤, orderItem에 Cancel 메서드를 실행시킨다.
- OrderItem의 Cancel 메소드
- 재고 수량을 원복 해준다.
- OrderItem의 Cancel 메소드
- getTotalPrice 메서드
- 총가격의 더해준다.
- orderItem의 getTotalPrice 메서드를 호출하여 총 가격의 값에 더해준다.
- OrderItem의 getTotalPrice 메소드
- 재고 * 가격을 값을 더해준다.
- OrderItem의 getTotalPrice 메소드
주문 상품 엔티티, 비즈니스 로직 개발
@Entity
@Getter
@Setter
public class OrderItem {
@Id
@GeneratedValue
@Column(name = "order_item_id")
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "item_id")
private Item item;
@ManyToOne(fetch = FetchType.LAZY)
@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);//재고수량을 원복해준다
}
public int getTotalPrice() {
return orderPrice * count;
}
}
- createOrderItem 메서드
- 생성 메서드를 만들어 OrderItem를 생성하기 위해 연관된 것들을 다 세팅해 준다.
- 후에 생성 로직이 변경되어도 이 메서드만 변경하면 된다.
- 재고의 개수를 감소시킨다.
- cancel 메서드
- 재고 수량을 원복 해준다.
- getTotalPrice 메서드
- 총가격의 더해준다.
- orderItem의 getTotalPrice 메서드를 호출하여 총 가격의 값에 더해준다.
- OrderItem의 getTotalPrice 메소드
- 재고 * 가격을 값을 더해준다.
- OrderItem의 getTotalPrice 메소드
728x90
'실전! 스프링 부트와 JPA 활용1(웹 애플리케이션 개발)' 카테고리의 다른 글
| Ch06. 상품 도메인 개발 - 주문 기능 테스트 (0) | 2021.12.06 |
|---|---|
| Ch06. 상품 도메인 개발 - 주문 Repository 개발, 주문 Service 개발 (0) | 2021.12.06 |
| Ch05. 상품 도메인 개발 - 상품 Service 개발 (0) | 2021.12.05 |
| Ch05. 상품 도메인 개발 - 상품 Repository 개발 (0) | 2021.12.05 |
| Ch05. 상품 도메인 개발 - 상품 엔티티 개발(비즈니스 로직 추가) (0) | 2021.12.05 |