주문하기 - 단일 상품 주문

루민 ·2023년 5월 21일
0
post-thumbnail

📜 미리보기

  • 상품 상세 화면에서 상품을 바로 주문하는 기능을 구현하였습니다.

📜OrderService

	/**
     * 단일 주문
     */
    public Long order(Long memberId, Long itemId, int count) {

        List<OrderItem> orderItemList = new ArrayList<>();
        Item findItem = itemRepository.findById(itemId).orElseGet(() -> null);
        Member findMember = memberRepository.findById(memberId).orElseGet(() -> null);
        int orderPrice = findItem.getPrice() * count;

        OrderItem orderItem = OrderItem.createOrderItem(count, orderPrice, findItem);
        orderItemList.add(orderItem);
        Order order = Order.createOrder(findMember, orderItemList);

        Order save = orderRepository.save(order);
        return save.getId();

    }
//OrderItem 클래스 
public static OrderItem createOrderItem(int count, int orderPrice, Item item) {
        item.minStock(count);
        return new OrderItem(count, orderPrice, item);
    }
	//Item 클래스 
  	//주문시 상품 재고 감소
    public void minStock(int quantity) {
        int restQuantity = stockQuantity - quantity;
        if (restQuantity < 0) {
            throw new NotEnoughStockException("상품 재고가 부족합니다!!");
        }
        stockQuantity = restQuantity;
    }
	//Order 클래스
    public static Order createOrder(Member member, List<OrderItem> orderItems) {  //List<OrderItem> list??
        Order order = new Order(member);
        for (OrderItem orderItem : orderItems) {
            order.addOrderItem(orderItem);
        }
        return order;
    }
    
      //==연관 관계 메서드==//
    public void addOrderItem(OrderItem orderItem) {
        orderItems.add(orderItem);
        orderItem.changeOrder(this);
    }
  • 파라미터로 넘어온 memberId, itemId, count를 이용해 주문 상품(OrderItem), 주문(order) 객체를 생성하고 OrderRepository에 저장하는 서비스 로직입니다.
  • 주문시 상품 재고를 빼기 위해 OrderItem객체를 생성할 때 상품의 재고를 마이너스(minStock)하도록 하였습니다.
  • 만약 상품 재고가 부족하면 NotEnoughStockException을 예외로 던져주도록 하였습니다.

📜OrderController

	/**
     * 단일 상품 바로 주문
     */
    @PostMapping("/order")
    public ResponseEntity<String> order(@ModelAttribute CartForm cartForm, HttpServletRequest request) {

		//CartController 에 작성해둔 세션 정보 조회하는 기능 공용으로 사용 
        Member member = CartController.getMember(request);

        if (member == null) {
            return new ResponseEntity<String>("로그인이 필요한 서비스입니다.", HttpStatus.UNAUTHORIZED);
        }

        try {
            orderService.order(member.getId(), cartForm.getItemId(), cartForm.getCount());
        } catch (NotEnoughStockException e) {
            return new ResponseEntity<String>(e.getMessage(), HttpStatus.BAD_REQUEST);
        }

        return ResponseEntity.ok("order Success");
    }
@Getter
@Setter
public class CartForm {

    private Long itemId;
    private int count;
}
  • 세션 정보를 조회해서 세션에 사용자가 존재하지 않으면 UNAUTHORIZED(401) 에러
  • 상품 재고가 부족하면 BAD_REQUEST(400) 에러로 처리하였습니다.

📜itemView.html

<!-- 단일 상품 바로 주문 -->
    function order() {


        var itemId = $("#id").val();
        var count = $("#count").val();
        var cartForm = {
            itemId : itemId,
            count : count
        };

        $.ajax({
            url: "/order",
            data: cartForm,
            type: 'POST',
            success: function(result) {
                alert("상품 주문이 완료되었습니다.");
                location.href = "/";
            },

            error: function (jqXHR, textStatus, errorThrown) {
                if (jqXHR.status === 401) {
                    alert(jqXHR.responseText);
                    location.href="/members"
                }
                else {
                    alert(jqXHR.responseText);
                }
            }
        })
    }
  • ajax를 활용해 상품 아이디와 상품 주문 수량을 cartForm에 매핑하여 컨트롤러에 전달해주었습니다.
  • 401에러(UNAUTHORIZED)가 발생할 시 로그인 화면으로 이동하도록 하고
  • 그 밖에 에러(상품 재고 부족으로 인한 에러)를 따로 처리하였습니다.

📜결과 및 실행 화면

  • 데이터베이스

0개의 댓글