728x90
주문 엔티티 개발
기능 설명
- 생성 메서드(createOrder()) : 주문 엔티티를 생성할 때 사용한다. 주문 회원, 배송 정보, 주문 상품의 정보를 받아서 실제 주문 엔티티를 생성한다.
- 주문 취소(cancel()) : 주문 취소 시 사용한다. 주문 상태를 취소로 변경하고, 주문 상품에 주문 취소를 알린다. 만약 이미 배송을 완료한 상품이면 주문을 취소하지 못하도록 예외를 발생시킨다.
- 전체 주문 가격 조회 : 주문 시 사용한 전체 주문 가격을 조회한다. 전체 주문 가격을 알려면 각각의 주문 상품 가격을 알아야 한다. 로직을 보면 연관된 주문 상품들의 가격을 조회해서 더한 값을 반환한다. (실무에서는 주로 전체 주문 가격 필드를 주고 역정 규화)
public static Order createOrder(Member member, Delivery delivery, OrderItem... orderItems){
Order order = new Order();
order.serMember(member);
order.serDelivery(delivery);
for(OrderItem orderItem : orderItems){
order.addOrderItem(orderItem);
}
order.setStatus(OrderStatus.ORDER);
order.setOrderDate(LocalDateTime.now());
return order;
}
public void cancel(){
if(delivery.getStatue() == DeliveryStatus.COMP){
throw new IllegalStateException("이미 배송완료된 상품은 취소가 불가능합니다.");
}
this.setStatue(OrderStatus.CANCEL);
for(OrderItem orderItem : orderItems){
orderItem.cancel();
}
}
public int getTotalPrice(){
int totalPrice = 0;
for(OrderItem orderItem : orderItems){
totalPrice += orderItem.getTotalPrice();
}
return totalPrice;
}
주문 상품 엔티티 개발
기능 설명
- 생성 메서드(createOrderItem()) : 주문 상품, 가격, 수량 정보를 사용해서 주문 상품 엔티티를 생성한다. 그리고 item.removeStock(count)를 호출해서 주문한 수량만큼 상품의 재고를 줄인다.
- 주문 취소(cancel()) : getItem().addStock(count)를 호출해서 취소한 주문 수량만큼 상품의 재고를 증가시킨다.
- 주문 가격 조회(getTotalPrice()) : 주문 가격에 수량을 곱한 값을 반환한다.
public static OrderItem createOrderItem(Item item, int orderPrice, int count){
OrderItem orderItem = new OrderItem();
orderItem.setItem(item);
orderItem.setOrderPrice(orderPrice);
orderItem.setCount(count);
item.removeStock(count);
return orderItem;
}
public void cancel(){
getItem().addStock(count);
}
public int getTotalPrice(){
return getOrderPrice()*getCount();
}
주문 서비스 개발
주문 서비스는 주문 엔티티와 주문 상품 엔티티의 비즈니스 로직을 활용해서 주문, 주문 취소, 주문 내역 검색 기능을 제공한다.
- 주문(Order()) : 주문하는 회원 식별자, 상품 식별자, 주문 수량 정보를 받아서 실제 주문 엔티티를 생성 후 저장한다.
- 주문 취소(cancelOrder()) : 주문 식별자를 받아서 주문 엔티티를 조회한 후 주문 엔티티에 주문 취소를 요청한다.
- 주문 검색(findOrders()) : OrderSerch라는 검색 조건을 가진 객체로 주문 엔티티를 검색한다.
@Transactional
public Long order(Long memberId, Long itemId, int count){
//엔티티 조회
Member member = memberRepository.findOne(memberId);
Item item = itemRepository.findOne(itemId);
//배송정보 생성
Delivery delivery = new Delivery();
delivery.setAddress(member.getAddress());
delivery.setStatus(DeliveryStatus.READY);
//주문상품 생성
OrderItem orderItem = OrderItem.createOderItem(item, item.getPrice(),count);
//주문 생성
Order order = Order.createOder(member, delivery, orderItem);
//주문 저장
orderRepository.save(order);
return order.getId()
}
주문 검색 기능 개발
JPA에서 동적 쿼리를 어떻게 해결해야 하는가
OrderSerch 엔티티
public class OrderSearch{
private String memberName;
private OrderStatus orderStatus;
}
검색을 추가한 주문 리포지토리 코드 - Querydsl 사용하는 것이 좋음
public List<Order> findAll(OrderSearch orderSearch){
QOrder order = QOrder.order();
QMember member = QMember.member();
return query
.select(order)
.from(order)
.join(order.member, member)
.where(statusEq(orderSearch.getOrderStatus()),
nameLike(orderSearch.getMemberName()))
.limit(1000)
.fetch();
}
private BooleanExpression statusEq(OrderStatus statusCond){
if(statusCond == null){
return null;
}
return order.status.eq(statusCond);
}
private BooleanExpression nameLike(String nameCond){
if(!StringUtils.hasText(nameCond)){
return null;
}
return member.name.like(nameCond);
}
실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 - 인프런 | 강의
실무에 가까운 예제로, 스프링 부트와 JPA를 활용해서 웹 애플리케이션을 설계하고 개발합니다. 이 과정을 통해 스프링 부트와 JPA를 실무에서 어떻게 활용해야 하는지 이해할 수 있습니다., - 강
www.inflearn.com
'Back-End > Inflearn 강의' 카테고리의 다른 글
[JPA 활용 - 웹 애플리케이션 개발] 웹 계층 개발 (0) | 2022.09.12 |
---|---|
[JPA 활용 - 웹 애플리케이션 개발] 상품 도메인 개발 (0) | 2022.09.11 |
[JPA 활용 - 웹 애플리케이션 개발] 회원 도메인 개발 (0) | 2022.09.11 |
[JPA 활용 - 웹 애플리케이션 개발] 도메인 분석 설계 (0) | 2022.09.11 |
[자바 ORM 표준 JPA 프로그래밍 - 기본편] 객체지향 쿼리 언어2 - 중급 문법 (0) | 2022.09.09 |