상품 엔티티 개발(비즈니스 로직 추가)


상품 엔티티 코드

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "dtype")
@Getter @Setter
public abstract class Item {

		private int stockQuantity;

		...

		/**
		* 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;
		}
}

보통의 경우 서비스 측에 비즈니스 로직을 구현하여 setter를 통해 값을 넣는다. 하지만 데이터를 가지고 있는 쪽에 비즈니스 로직이 존재하도록 구현해야 객체의 응집력을 높일 수 있다.

즉, 도메인 주도 설계 방식을 사용했다. 도메인 주도 설계는 도메인이 비즈니스 로직의 주도권을 가지고 개발하는 설계 방식을 말한다. 이를 통해 서비스는 엔티티를 호출하는 정도의 얇은 비즈니스 로직을 갖게 된다.

위처럼 도메인 주도 설계는 엔티티를 객체로서 사용하는 것이고, 엔티티가 아닌 서비스 로직에 비즈니스 로직을 넣는 것은 엔티티를 자료구조로써 사용하는 것이다.

예외 추가

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

상품 주문 시 재고가 부족할 경우 NotEnoughStockException 예외가 발생한다.

상품 리포지토리 개발


상품 리포지토리 코드

@Repository
@RequiredArgsConstructor
public class MemberRepository {

    private final EntityManager em;

    public void save(Member member) {
        em.persist(member);
    }

    public Member findOne(Long id) {
        return em.find(Member.class, id);
    }

    public List<Member> findAll() {
        return em.createQuery("select m from Member m", Member.class)
                .getResultList();
    }

    public List<Member> findByName(String name) {
        return em.createQuery("select m from Member m where m.name = :name", Member.class)
                .setParameter("name", name)
                .getResultList();
    }
}

상품 서비스 개발