본문 바로가기
BackEnd/JPA

[JPA] 상품 도메인 개발

by 개발 Blog 2024. 10. 3.

공부 내용을 정리하고 앞으로의 학습에 이해를 돕기 위해 작성합니다.

 

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

 

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