package jpabook.jpashop.domain.item;
import jpabook.jpashop.domain.Category;
import jpabook.jpashop.domain.exception.NotEnoughStockException;
import lombok.Getter;
import lombok.Setter;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "dtype")
@Getter @Setter
public class Item {
@Id
@GeneratedValue
@Column(name = "item_id")
private Long id;
private String name;
private int price;
private int stockQuantity;
@ManyToMany(mappedBy = "items")
private List<Category> categories = new ArrayList<>();
//stock 증가
public void addStock(int quantity){
this.stockQuantity += quantity;
}
//stock 감소
public void removeStock(int quantity){
int restStock = this.stockQuantity - quantity;
if (restStock < 0) {
throw new NotEnoughStockException("need more stock");
}
this.stockQuantity = restStock;
}
}
<aside> ⚠️ 재고를 늘리고 줄이는 비즈니스로직. 보통은 서비스 클래스에서 엔티티를 호출한 후 데이터를 가공하여 setter로 다시 엔티티를 수정하여 해당 엔티티 객체를 jdbc메소드로 넘기는 방식으로 배웠을 것이다. 그러나 stockQuantity가 엔티티 클래스에 있으니 여기에 로직을 적는 것이 응집도를 높이기 좋다.
</aside>
package jpabook.jpashop.domain.exception;
public class NotEnoughStockException extends RuntimeException{
public NotEnoughStockException() {
super();
}
public NotEnoughStockException(String message) {
super(message);
}
public NotEnoughStockException(String message, Throwable cause) {
super(message, cause);
}
public NotEnoughStockException(Throwable cause) {
super(cause);
}
}
<aside> ⚠️ RuntimeException을 상속받고 Generate Method 단축키(기본값 Ctrl+Insert)로 부모 클래스의 모든 메소드를 구현한다.
</aside>
addStock() : 파라미터로 넘어온 quantity만큼 재고를 늘린다. 재고가 증가하거나,