공부 내용을 정리하고 앞으로의 학습에 이해를 돕기 위해 작성합니다.
상품 엔티티 개발(비즈니스 로직 추가)
Item 수정
Item 엔티티에 비즈니스 로직을 추가하여 재고 관리를 쉽게 할 수 있도록 구현한다.
// 비즈니스 로직
/**
* 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;
}
- 상품 엔티티에 재고 관리를 위한 비즈니스 로직을 추가했다.
- addStock() 메서드는 전달된 수량만큼 재고를 증가시키고, 재고가 추가로 필요할 때(예: 주문 취소 등) 사용된다.
- 반면 removeStock() 메서드는 전달된 수량만큼 재고를 감소시키며, 재고가 부족할 경우 NotEnoughStockException을 발생시킨다. 이 메서드는 주로 상품 주문 시에 사용된다.
notenoughstockexception 추가
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);
}
protected NotEnoughStockException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}
- 재고가 부족할 때 발생하는 예외를 처리하기 위해 NotEnoughStockException이라는 커스텀 예외 클래스를 추가했다.
- 이 클래스는 재고가 부족한 상황에서 예외를 발생시키며, 메시지와 원인을 함께 전달할 수 있다.
상품 리포지토리 개발
itemRepository 추가
package jpabook.jpashop.repository;
import jakarta.persistence.EntityManager;
import jpabook.jpashop.domain.item.Item;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
import java.util.List;
@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();
}
}
- ItemRepository 클래스는 JPA의 EntityManager를 사용하여 상품을 저장, 조회, 수정하는 역할을 한다.
- save() 메서드는 상품의 id를 기준으로 신규 상품인지 기존 상품인지를 판단하여, 신규 상품인 경우 persist()를 통해 저장하고, 기존 상품인 경우 merge()를 통해 데이터를 수정한다.
- findOne() 메서드는 특정 ID에 해당하는 상품을 조회하며, findAll() 메서드는 모든 상품 리스트를 조회하는 기능을 제공한다.
상품 서비스 개발
ItemService추가
package jpabook.jpashop.service;
import jpabook.jpashop.domain.item.Item;
import jpabook.jpashop.repository.ItemRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class ItemService {
private final ItemRepository itemRepository;
@Transactional
public void saveItem(Item item) {
itemRepository.save(item);
}
public List<Item> findItems() {
return itemRepository.findAll();
}
public Item findOne(Long itemId) {
return itemRepository.findOne(itemId);
}
}
- ItemService는 리포지토리의 기능을 단순히 위임하는 서비스 계층이다.
- 서비스에서는 트랜잭션 처리를 통해 일관성을 유지하며, 상품 저장, 조회 등의 기능을 제공한다.
- saveItem() 메서드는 상품을 저장하고, findItems()는 모든 상품을 조회하며, findOne()은 특정 상품을 조회하는 역할을 한다.
'BackEnd > JPA' 카테고리의 다른 글
[JPA] 웹 계층 개발(1) (2) | 2024.10.04 |
---|---|
[JPA] 주문 도메인 개발 (3) | 2024.10.03 |
[JPA] 회원 도메인 개발 (0) | 2024.10.02 |
[JPA] 도메인 분석 설계(3) (2) | 2024.10.01 |
[JPA] 도메인 분석 설계(2) (0) | 2024.09.26 |