🔍 Controller

@Transactional
@PostMapping("/user/order")
public ResponseEntity<List<ResponseOrder>> create_order(HttpServletRequest request, @RequestBody RequestOrder requestOrder){
    List<ResponseOrder> responseOrderList = orderService.create_order((User) request.getAttribute("user"), requestOrder);
    if (responseOrderList == null) { return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null); }

    Boolean state = productService.purchaseProduct(requestOrder);
    return (state) ?
            ResponseEntity.status(HttpStatus.OK).body(responseOrderList) :
            ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null);
}

OrderServicecreate_order함수를 호출하고 결과가 null이면 400

그 이후 ProductServicepurchaseProduct 함수를 호출하고 결과에 따라 200 또는 400의 status code를 반환

🔍 Service

@Override
@Transactional
public List<ResponseOrder> create_order(User user, RequestOrder requestOrder) {
    User userPersisted = entityManager.find(User.class, user.getId());

    if (userPersisted == null || requestOrder.getQueryOrderProductList().isEmpty()) {
        return null;
    }

    Order order = requestOrder.toEntity();

    Order savedOrder = orderRepository.save(order);
    userPersisted.addOrder(savedOrder);

    List<OrderProduct> orderProductList = productRepository.findByIdList(requestOrder.getQueryOrderProductList()
            .stream().map(QueryOrderProduct::getProduct_id).toList())
            .stream().map(product -> OrderProduct.builder()
                    .id(null)
                    .count(1)
                    .order(null)
                    .product(product)
                    .size("M")
                    .build()
            ).toList();

    for(OrderProduct orderProduct : orderProductList) {
        for(QueryOrderProduct queryOrderProduct : requestOrder.getQueryOrderProductList()){
            if(Objects.equals(orderProduct.getProduct().getId(), queryOrderProduct.getProduct_id())) {
                orderProduct.setOption(queryOrderProduct.getCount(), queryOrderProduct.getSize());
                break;
            }
        }
    }

    List<OrderProduct> savedOrderProductList = orderProductRepository.saveAll(orderProductList);
    savedOrder.addAllOrderProduct(savedOrderProductList);

    return read_order(userPersisted);
}

파라미터로 받아온 User는 준영속 객체이므로 User 의 프록시 객체를 참조하면 Lazyinitializationexception 가 발생 → EntityManager로 영속화시킴

영속화 User가 null이거나 Request으로 받은 List가 비어있을 때 null 리턴

Request로 받아온 정보로 OrderOrderProduct들을 만들고 UserOrder

OrderOrderProduct를 연결

read_order 함수는 링크 참고

@Override
public Boolean purchaseProduct(RequestOrder requestOrder) {
    int value = 0;
    List<ChangeStockQuery> changeStockList =
            productRepository.findRemoveByProductIDList(requestOrder.getQueryOrderProductList().stream().map(QueryOrderProduct::getProduct_id).toList());

    HashMap<Long, Integer> productMap = new HashMap<>();
    for(ChangeStockQuery changeStockQuery : changeStockList){
        productMap.put(changeStockQuery.getProduct_id(), changeStockQuery.getStock());
    }

    for(QueryOrderProduct queryOrderProduct : requestOrder.getQueryOrderProductList()){
        value = productMap.get(queryOrderProduct.getProduct_id()) - queryOrderProduct.getCount();

        if(value < 0) {
            return false;
        }

        productMap.put(queryOrderProduct.getProduct_id(), value);
    }

    return productRepository.updateProductListStock(productMap) != 0;
}

구매한 상품의 개수를 재고에서 빼주기 위한 함수

원래 재고를 파악하기 위해 findRemoveByProductIDList 함수 사용

findRemoveByProductIDList 함수를 사용해 나온 결과와 구매한 상품의 개수의 차를 **HashMap<상품 아이디, 개수 차>**에 담음

개수 차가 0보다 작다면 false 리턴

ProductRepositoryupdateProductListStock 함수를 이용해 재고 업데이트