@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "dtype")
@Getter
@Setter // 편의상, 일단 setter를 넣어 두었다.(그러나 만약 stockQuantity를 더하고 빼서 변경해야 할 때,
// 클라이언트 코드 상, 즉 Item 클래스 밖에서 setter를 이용하여 더하고 빼서 변경하는 것보다는, 아래와 같이
// addStock(), removeStock()과 같은 메서드를 만들어서 밖이 아닌, 안에서 변경하는 것이 보다 객체 지향 적이다.
public abstract 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<>();
//비즈니즈 로직(해당 데이터에 대한 로직은 그 데이터를 가지고 있는 객체에서 정의하는 것이 좋음)
//재고 증가
public void addStock(int stockQuantity){
this.stockQuantity += stockQuantity;
}
//재고 줄이기
public void removeStock(int stockQuantity){
if(this.stockQuantity - stockQuantity < 0){
throw new NotEnoughStockException("need more stock");
}
this.stockQuantity = this.stockQuantity - stockQuantity;
}
}