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();
 }

 

상품 서비스개발


회원 서비스 개발 내용 참고.

 

회원 도메인 개발 Spring Boot 기본 (3)

들어가며 이전 1편과 2편에서의 내용은 Domain을 DB와 연동시키는 내용이었다. 3편부터 5편까지(아마도?)는 회원, 상품, 주문 도메인 내의 Controller, Service, Repository를 개발하여 기능을 부여하려고 한

wooltech.tistory.com

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

 

+ Recent posts