728x90
상품 엔티티 개발
추상 클래스 (Abstract Class):
상품 클래스는 추상클래스로 설정되어 있다.
추상클래스는 직접 객체 생성이 불가능하다. 상속을 통해 확장하고 자식(하위)클래스에서 구현된다.
상품 클래스가 가진 속성은 아래와 같다.
- 상품 id (PK)
- 이름
- 가격
- 재고수량
- 카테고리 목록
@Inheritance와 @DiscriminatorColumn은 상속 관계 매핑에서 단일 테이블 전략에 사용된다.
@Inheritance은 아래와 같이 전략 타입을 설정한다.
- InheritanceType.SINGLE_TABLE: 단일 테이블 전략
- InheritanceType.JOINED: 조인 전략
- InheritanceType.TABLE_PER_CLASS: 구현 클래스마다 테이블 생성 전략
@DiscriminatorColumn을 dtype으로 명명해 하위 클래스의 값을 구분하여 다형성을 구현한다.
하위 클래스는 @DiscriminatorValue에 "값"을 지정해 단일 테이블 내에서 구분될 수 있다.
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "dtype")
@Getter @Setter
public abstract class Item {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "item_id")
private Long id;
private String name;
private int price;
private int stockQuantity;
상품 엔티티는 stockQuantity라는 정수 값을 갖는다.재고 수량은 주문에 따라 변화하는 값이며, 0이하로 내려갈 수 없는 성격을 가지고 있다.따라서, 추가적인 비즈니스 로직이 필요하고 예외 처리를 위한 로직도 작성해야 한다.
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;
}
}
add와 remove를 통해 증감을 계산하고, if문의 restStock이 0보다 작은 경우 예외처리를 수행한다.
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);
}
}
비체크 예외인 RuntimeException을 상속 받아 생성자를 두고 다양한 예외에 대응한다.자바에서는 체크 예외와 비체크 예외를 통해 예외 처리를 한다. 이후 예외 처리에 대해 공부할 것.
상품 리포지토리 개발
@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();
}
상품 서비스개발
회원 서비스 개발 내용 참고.
@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class ItemService {
//lombok 생성자 주입
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);
}
'Java Spring > Spring Boot' 카테고리의 다른 글
웹 계층 컨트롤러 개발 Spring Boot 기본 (5) (0) | 2023.12.12 |
---|---|
주문 도메인 개발 Spring Boot 기본 (4) (0) | 2023.12.11 |
회원 도메인 개발 Spring Boot 기본 (2) (1) | 2023.12.08 |
도메인 설계 Spring Boot 기본 (1) (1) | 2023.12.07 |