Super Kawaii Cute Cat Kaoani [스프링 부트와 JPA 활용 1] 4. 상품 도메인 개발

[스프링 부트와 JPA 활용 1] 4. 상품 도메인 개발

2024. 1. 23. 15:20
728x90
SMALL

📌 상품 도메인 개발

✔ 구현 기능

  • 상품 등록
  • 상품 목록 조회
  • 상품 수정

✔ 순서

  • 상품 엔티티 개발(비즈니스 로직 추가)
  • 상품 리포지토리 개발
  • 상품 서비스 개발
  • 상품 기능 테스트

 

 

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

상품 엔티티 코드

🔶 main/.../domain/Item

package jpabook.jpashop.domain.item;
 import jpabook.jpashop.exception.NotEnoughStockException;
 import lombok.Getter;
 import lombok.Setter;
 import jpabook.jpashop.domain.Category;
 import javax.persistence.*;
 import java.util.ArrayList;
 import java.util.List;
 @Entity
 @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
 @DiscriminatorColumn(name = "dtype")
 @Getter @Setter
 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<Category>();
//==비즈니스 로직==//
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;
     }
}

 

 

  • 예외 코드
    package jpabook.jpashop.exception;
    public class NotEnoughStockException extends RuntimeException {
       public NotEnoughStockException() {
       }
       public NotEnoughStockException(String message) {
           super(message);
    }
       public NotEnoughStockException(String message, Throwable cause) {
           super(message, cause);
    }
    public NotEnoughStockException(Throwable cause) {
           super(cause);
    } }

✔ 비지니스 로직 분석

  • addStock() 메서드는 파라미터로 넘어온 수만큼 재고를 늘림
    • 이 메서드는 재고가 증가하거나 상품 주문을 취소해서 다시 재고를 늘려야 할 때 사용
  • removeStock() 메서드는 파라미터로 넘어온 수만큼 재고 감소
    • 만약 재고가 부족하면 예외가 발생
    • 주로 상품 주문 시 사용

 

반응형

 

📌 상품 리포지토리 개발

🔶 main/.../repository/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();
    }


}

✔ 기능 설명

  • save()
    • id 가 없으면 신규로 보고 persist() 실행
    • id가 있으면 이미 데이터베이스에 저장된 엔티티를 수정한다고 보고, merge() 실행

 

 

 

📌 상품 서비스 개발

상품 서비스 코드

🔶 main/.../service/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);
    }
}
  • 상품 서비스는 상품 리포지토리에 단순히 위임만 하는 클래스
  • 상품 기능 테스트는 회원 테스트와 비슷하므로 생략함

 

 

 

<실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발_김영한>을 수강하고 작성한 글입니다

 

 

 

 

 


PREV

 

[스프링 부트와 JPA 활용 1] 3. 애플리케이션 구현 준비, 회원 도메인 개발

📌 구현 요구사항 회원 기능 회원 등록 회원 조회 상품 기능 상품 등록 상품 수정 상품 조회 주문 기능 -상품 주문 -주문 내역 조회 -주문 취소 ✔ 예제를 단순화하기 위해 다음 기능은 구현하지

nyeroni.tistory.com

NEXT

 

[스프링 부트와 JPA 활용 1] 5. 주문 도메인 개발

📌 구현 기능 및 순서 ✔ 구현 기능 상품 주문 주문 내역 조회 주문 취소 ✔ 순서 주문 엔티티 , 주문 상품 엔티티 개발 주문 리포지토리 개발 주문 서비스 개발 주문 검색 기능 개발 주문 기능

nyeroni.tistory.com

 

728x90
LIST

BELATED ARTICLES

more