728x90
반응형
SMALL
2024.10.08 - [Spring Framework/Spring Boot] - [Spring Boot] 쇼핑몰 #3 - 엔티티 클래스 개발
[Spring Boot] 쇼핑몰 - 엔티티 클래스 개발
2024.10.07 - [Spring Framework/Spring Boot] - 도메인 모델과 테이블 설계 도메인 모델과 테이블 설계* 요구사항 분석회원 기능회원 등록회원 조회상품 기능상품 등록상품 수정상품 조회주문 기능상품 주
djjin02.tistory.com
1. 주문(Order) 엔티티


2. 주문 상품(OrderItem) 엔티티

3. 주문 리포지토리
이 OrderRepository 클래스는 주문(Order) 엔티티와 관련된 데이터를 저장하고 조회하는 기능을 수행한다.
EntityManager를 통해 DB 작업을 처리하며, 스프링 컨텍스트에서 의존성 주입을 통해 관리된다.

4. 주문 서비스
OrderService 클래스는 주문 생성과 주문 취소 기능을 각각 처리하며, 주문 처리 과정에서 필요한 엔티티들을 DB에서 조회 및 처리한다.
@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class OrderService {
private final MemberRepository memberRepository;
private final OrderRepository orderRepository;
private final ItemRepository itemRepository;
// 주문
@Transactional
public Long order(Long memberId, Long itemId, int count) {
// 1. 엔티티 조회
Member member = memberRepository.findOne(memberId); // 회원 엔티티
Item item = itemRepository.findOne(itemId); // 상품 엔티티
// 2. 배송정보 생성
Delivery delivery = new Delivery(); // 배송 엔티티 생성
delivery.setAddress(member.getAddress()); // 회원의 주소를 배송 주소로 설정
delivery.setStatus(DeliveryStatus.READY); // 배송 상태를 READY로 설정
// 3. 주문상품 생성 : 주문할 상품과 수량을 설정하여 생성
OrderItem orderItem = OrderItem.createOrderItem(item, item.getPrice(), count);
// 4. 주문 생성 : 회원, 배송정보, 주문상품 기반
Order order = Order.createOrder(member, delivery, orderItem);
// 5. 주문 저장 : 생성된 주문을 DB에 저장
orderRepository.save(order);
return order.getId();
}
// 주문 취소
@Transactional
public void cancelOrder(Long orderId) {
Order order = orderRepository.findOne(orderId); //주문 엔티티 조회
order.cancel(); //주문 취소
}
5. 테스트
@ExtendWith(SpringExtension.class)
@SpringBootTest
@Transactional
public class OrderServiceTest {
@PersistenceContext EntityManager em;
@Autowired OrderService orderService;
@Autowired OrderRepository orderRepository;
/** 상품 주문 테스트 **/
@Test
public void 상품주문() throws Exception {
// Given
Member member = createMember(); // 회원 생성
Item item = createBook("시골 JPA", 10000, 10); // 책 상품 생성
int orderCount = 2; // 상품 2개 주문
// When : 주문 처리
Long orderId = orderService.order(member.getId(), item.getId(), orderCount);
//Then : 주문 정보 조회
Order getOrder = orderRepository.findOne(orderId);
assertEquals(OrderStatus.ORDER, getOrder.getStatus(), "상품 주문시 상태는 ORDER여야 한다.");
assertEquals(1, getOrder.getOrderItems().size(), "주문한 상품 종류 수가 정확해야 한다.");
assertEquals(10000 * 2, getOrder.getTotalPrice(), "주문 가격은 가격 * 수량이어야 한다.");
assertEquals(8, item.getStockQuantity(), "주문 수량만큼 재고가 줄어야 한다.");
}
/** 재고 수량 초과 테스트 **/
@Test
public void 상품주문_재고수량초과() throws Exception {
//Given
Member member = createMember();
Item item = createBook("시골 JPA", 10000, 10); // 이름, 가격, 재고
int orderCount = 11; //재고보다 많은 수량
// When & Then
assertThrows(NotEnoughStockException.class, () -> {
orderService.order(member.getId(), item.getId(), orderCount);
}, "재고 수량 부족 예외가 발생해야 한다.");
}
/** 주문 취소 테스트 **/
@Test
public void 주문취소() {
// Given
Member member = createMember();
Item item = createBook("시골 JPA", 10000, 10);
int orderCount = 2;
Long orderId = orderService.order(member.getId(), item.getId(), orderCount);
// When : 주문 취소
orderService.cancelOrder(orderId);
// Then : 주문 정보 조회
Order getOrder = orderRepository.findOne(orderId);
// 주문이 취소되었는지 상태 확인
assertEquals(OrderStatus.CANCEL, getOrder.getStatus(), "주문 취소 시 상태는 CANCEL이어야 한다.");
// 주문 취소 후 재고 복구 확인
assertEquals(10, item.getStockQuantity(), "주문이 취소된 상품은 그만큼 재고가 증가해야 한다.");
}
private Member createMember() {
Member member = new Member();
member.setName("회원1");
member.setAddress(new Address("서울", "강가", "123-123"));
em.persist(member);
return member;
}
private Book createBook(String name, int price, int stockQuantity) {
Book book = new Book();
book.setName(name);
book.setStockQuantity(stockQuantity);
book.setPrice(price);
em.persist(book);
return book;
}
}

끝.
728x90
반응형
LIST
'WEB > Spring Boot' 카테고리의 다른 글
[Spring Boot] 쇼핑몰 #5 - 상품 도메인 개발 (0) | 2024.10.12 |
---|---|
[Spring Boot] 쇼핑몰 #4 - 회원 도메인 개발 (4) | 2024.10.11 |
[Spring Boot] 쇼핑몰 #3 - 엔티티 클래스 개발 (7) | 2024.10.08 |
[Spring Boot] 쇼핑몰 #2 - 도메인 모델과 테이블 설계 (2) | 2024.10.07 |
[Spring Boot] 쇼핑몰 - 환경설정(View, H2 Database, JPA) (1) | 2024.10.05 |
댓글