본문 바로가기

CS 잡지식

Setter는 되도록 최소한으로 사용하고, 지양해야 한다.

@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;

    }
}