📜 미리보기
- 상품 상세 화면에서 상품을 바로 주문하는 기능을 구현하였습니다.
📜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();
}
public static OrderItem createOrderItem(int count, int orderPrice, Item item) {
item.minStock(count);
return new OrderItem(count, orderPrice, item);
}
public void minStock(int quantity) {
int restQuantity = stockQuantity - quantity;
if (restQuantity < 0) {
throw new NotEnoughStockException("상품 재고가 부족합니다!!");
}
stockQuantity = restQuantity;
}
public static Order createOrder(Member member, List<OrderItem> orderItems) {
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) {
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)가 발생할 시 로그인 화면으로 이동하도록 하고
- 그 밖에 에러(상품 재고 부족으로 인한 에러)를 따로 처리하였습니다.
📜결과 및 실행 화면
- 데이터베이스