스프링데이터 + JPA/웹 애플리케이션 개발

15. 상품 개발

sdafdq 2023. 11. 7. 07:57

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

상품 리포지토리 개발

상품 서비스 개발

 

상품 등록

상품 목록 조회

상품 수정

 

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "dtype")
@Getter
public abstract class Item {
    @Id @GeneratedValue
    @Column(name = "item_id")
    private Long id;

    private String name;

    private int price;

    private int stockQuantity;

    @ManyToMany(mappedBy = "items")
    private List<Category> categories = new ArrayList<>();

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

비즈니스 메소드를 2개 추가했다.

 

이런 식으로 setter 자체를 넣는 게 아니라, 비즈니스 메소드를 만들어 주는 게 좋다.

 

 

 

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

여기서 처음보는 건 merge

저거는 강제 업데이트라고 한다. 나중에 설명한다고 한다.

 

 

아이템 서비스

@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class ItemService {
    private final ItemRepository itemRepository;

    @Transactional(readOnly = false)
    public void saveItem(Item item){
        itemRepository.save(item);
    }

    public List<Item> findItems(){
        return itemRepository.findAll();
    }

    public Item findOne(Long itemId){
        return itemRepository.findOne(itemId);
    }
}

save 할 때 사실 readOnly 기본이 false라 그냥 @Transactional만 해줘도 됨.

 

 

사실 이렇게 리포지토리 위임만 하는 역할의 서비스는 컨트롤러에서 직접 사용해도 괜찮다고 함.

 

 

 

테스트는 간단하고 비슷해서 넘어갔지만, 실무에서는 꼭 테스트 해야 함.

'스프링데이터 + JPA > 웹 애플리케이션 개발' 카테고리의 다른 글

17. 주문 리포지토리, 서비스  (0) 2023.11.07
16. 주문 도메인 개발  (0) 2023.11.07
14. 회원 테스트  (0) 2023.11.06
13. 회원 서비스  (0) 2023.11.06
12. 회원 리포지토리  (0) 2023.11.06