728x90
반응형
📌 상품 도메인 개발
✔ 구현 기능
- 상품 등록
- 상품 목록 조회
- 상품 수정
✔ 순서
- 상품 엔티티 개발(비즈니스 로직 추가)
- 상품 리포지토리 개발
- 상품 서비스 개발
- 상품 기능 테스트
📌 상품 엔티티 개발(비즈니스 로직 추가)
상품 엔티티 코드
🔶 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
반응형
'인프런 Spring 강의 정리 > 실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발' 카테고리의 다른 글
[스프링 부트와 JPA 활용 1] 6. 웹 계층 개발 (1) | 2024.01.24 |
---|---|
[스프링 부트와 JPA 활용 1] 5. 주문 도메인 개발 (0) | 2024.01.24 |
[스프링 부트와 JPA 활용 1] 3. 애플리케이션 구현 준비, 회원 도메인 개발 (0) | 2024.01.23 |
[스프링 부트와 JPA 활용1] 2. 도메인 분석 설계 (2) | 2024.01.23 |
[스프링 부트와 JPA 활용 1] 1. 프로젝트 환경 설정 (1) | 2024.01.23 |