Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

상품 domain, repository, service개발 본문

인프런/[인프런] Springboot와 JPA활용 1

상품 domain, repository, service개발

Seung__ 2021. 8. 6. 11:18

1. 구현 기능


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

 

 

2. 개발 순서


  • 상품 엔티티 개발, 비느지느 로직 추가
  • 상품 repository
  • 상품 service
  • 상품 기능 test

 

 

 

3. Item class 개발


  • 객체 지향 관점으로는 데이터를 가지고 있는 곳 에서 business method가 있는 것이 좋다. 
  • 따라서 도메인 주도 설계 시 엔티티 자체가 해결할 수 있는 것은엔티티 안에 메서드를 만듦.
  • 이 때 Setter로 변경하는 것이 아니라 특정 메서드(로직)을 통해 값을 변경해야 한다.
  • 예제의 경우 주문에 따라 재고 수량(stockQuantity)가 변경이된다.
  • stockQuantity는 Item에서 가지고 있다.
  • 따라서 stockQuantity가 변경되는 로직은 Item에 추가하자.
  • Item class
    - 현재 예제를 위해서 @Setter가 열려있다.
    - 하지만 실제 운영에서는 @Setter를 열어두지 말고
    - 특정 비즈니스 로직을 통해 데이터를 변경해야 한다.
@Entity
@Setter
@Getter
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "dtype")
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<>();

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

    }

}

 

 

 

4. ItemRepository


  • PK(id)는 persist 전 까지 없다.
  • persist시점에 PK(id)생성된다.
  • id가 존재하면 merge()를 통해 managed상태로 전환
  • merge() : Merge the state of the given entity into the current persistence context.             
    -  해당 entity를 managed상태로 바꿈
@Repository
@RequiredArgsConstructor
public class ItemRepository {

    //엔티티메니저 주입
    private final EntityManager em;

    /**
     * 상품 저장
     */
    public void save(Item item){
        if(item.getId() == null){
            em.persist(item); //persist 전 까지 id 없음.
        }else {
            em.merge(item); //merge : update 비슷,
        }
    }

    /**
     *  상품 한 개 조회
     */
    public Item findOne(Long id){
        return em.find(Item.class, id);
    }

    /**
     *  상품 리스트 조회, JPQL사용
     */
    public List<Item> findAll(){
        return em.createQuery("select i from Item i", Item.class).getResultList();
    }
    
}

 

 

 

5. ItemService 개발


@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class ItemService {

    /**
     * ItemService는 단순히 ItemRepository에 위임하는 로직
     * 단순히 위임만 하는 로직이 필요할까..?
     */

    //repository 주입
    private final ItemRepository itemRepository;

    /**
     * Item 저장, @Transactional 별도 지정.
     */
    @Transactional
    public void saveItem(Item item){
        itemRepository.save(item);
    }

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

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

 

6. GitHub : 210806 Item domain,repository, service


 

GitHub - bsh6463/SpringBootJPA1

Contribute to bsh6463/SpringBootJPA1 development by creating an account on GitHub.

github.com

 

'인프런 > [인프런] Springboot와 JPA활용 1' 카테고리의 다른 글

주문 repository, Service  (0) 2021.08.06
주문 도메인 개발  (0) 2021.08.06
회원 기능 테스트  (0) 2021.08.06
MemberService 개발  (0) 2021.08.06
회원 도메인 개발  (0) 2021.08.06
Comments