[작성일: 2023. 08. 25]
상품 엔티티 개발
- 상품 엔티티 코드에서 비즈니스 로직을 추가한다.
- addStock() 메서드는 파라미터로 넘어온 수만큼 재고를 늘린다. 이 메서드는 재고가 증가하거나 상품 주문을 취소해서 재고를 다시 늘려야 할 때 사용한다.
- removeStock() 메서드는 파라미터로 넘어온 수만큼 재고를 줄인다. 만약 재고가 부족하면 예외가 발생하며 주로 상품을 주문할 때 사용한다.
@Entity
@Getter
@Setter
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "dtype")
public abstract class Item {
// 코드 생략
// 비즈니스 로직 추가
// stock(재고) 증가
public void addStock(int quantity) {
this.stockQuantity += quantity;
}
// 재고 감소
public void removeStock(int quantity) {
int restStock = this.stockQuantity - quantity;
if (restStock < 0) {
throw new NotEnoughStockException("need more stock");
}
this.stockQuantity = restStock;
}
}
예외 추가
예외는 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);
}
}
상품 리포지토리 개발
@Repository
@RequiredArgsConstructor
public class ItemRepository {
private final EntityManager em;
public void save(Item item) {
if (item.getId() == null) {
em.persist(item);
} else {
em.merge(item);
}
}
public Item findOne(Long id) {
return em.find(Item.class, id);
}
public List<Item> findAll() {
return em.createQuery("select i from Item i", Item.class)
.getResultList();
}
}
- save()
- id가 없으면 신규 상품으로 보고 persist() 실행
- id가 있으면 이미 데이터베이스에 저장된 엔티티를 수정한다고 보고 merge()를 실행
상품 서비스 개발
@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class ItemService {
private final ItemRepository itemRepository;
@Transactional
public void saveItem(Item item) {
itemRepository.save(item);
}
public Item findOne(Long id) {
return itemRepository.findOne(id);
}
public List<Item> findItems() {
return itemRepository.findAll();
}
}
🐣 출처: 인프런 김영한님 강의
이 글은 인프런의 김영한님 JPA 강의를 보고 작성한 글입니다.
강의를 들으면서 정리한 글이므로 틀린 내용이나 오타가 있을 수 있습니다.