1. 상품 Entity 개발
1) 도메인 주도 설계(DDD) 지향 비즈니스 로직 추가
도메인 안에서 해결할 수 있는 비즈니스 로직은 최대한 도메인 내에서 정의하는 것이 바람직하다. @Setter로 외부에서 값을 강제로 주입하는 것은 오히려 객체 지향적이지 못한 개발이다.
이에 앞서 개발한 Item Entity 내에서 stockQuantity의 증가/감소 비즈니스 로직을 구현하고자 한다. 다른 Entity에 정의한 프로퍼티를 인자로 받는 것이 아닌 stockQuantity만으로 처리할 수 있으므로 Entity 내에서 정의할 수 있다.
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@Getter @Setter
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<>();
//==비즈니스 로직==//
// 도메인 안에서 해결할 수 있는 비즈니스 로직은 도메인에서 정의하는 것이 바람직하다
/**
* 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;
}
}
package jpabook.jpashop.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);
}
}
2. 상품 Repository 개발
@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); // db에 등록된 것을 가져온 것이기 때문에 update와 유사하다
}
}
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();
}
}
3. 상품 Service 개발
@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class ItemService {
private final ItemRepository itemRepository;
@Transactional
public void saveItem(Item item) {
itemRepository.save(item);
}
public List<Item> findItem() {
return itemRepository.findAll();
}
public Item findOne(Long itemId) {
return itemRepository.findOne(itemId);
}
}
'🌱 Spring > JPA ①' 카테고리의 다른 글
[Spring] Member/Item 등록, 조회(필수 입력 필드 처리) (0) | 2023.08.23 |
---|---|
[Spring] 주문 Entity, Repository, Service 개발 (0) | 2023.08.09 |
[Spring] 회원 Service Unit Test 작성하기 (0) | 2023.08.05 |
[Spring] 회원 Service & Repository 개발 (0) | 2023.08.04 |
[Spring] Entity 설계 및 구현 (0) | 2023.08.03 |