이 내용은 스프링 부트 쇼핑몰 프로젝트 with JPA 책을 학습한 내용입니다.
1. Item Entity
- 주문 취소 시 상품의 재고를 상품 주문 수량만큼 다시 더해주는 addStock() 메소드를 추가함
// 상품 재고 증가시키는 메소드
public void addStock(int stockNumber) {
this.stockNumber += stockNumber;
}
2. OrderItem Entity
- Item.addStock() 메소드를 호출하는 cancel 메소드 추가
- 주문 상품 수량을 파라미터로 넘김
// 주문 취소시 주문 수량만큼 상품 재고 증가
public void cancel() {
this.getItem().addStock(count);
}
3. Order Entity
- 주문 상태를 CANCEL로 변경
- 모든 OrderItem 객체의 cancel() 메소드를 수행4. OrderService
// 주문 취소 시 주문 수량을 상품의 재고에 더해주고 주문 상태를 취소 상태로 바꿔주는 메소드 public void cancelOrder() { this.orderStatus = orderStatus.CANCEL; for(OrderItem orderItem : orderItems) { orderItem.cancel(); } }
- 상품을 주문한 유저와 주문 취소를 요청한 유저가 동일한지 검증
// 주문 취소
@Transactional(readOnly = true)
public boolean validateOrder(Long orderId, String email) {
Member curMember = memberRepository.findByEmail(email);
Order order = orderRepository.findById(orderId).orElseThrow(EntityNotFoundException::new);
Member savedMember = order.getMember();
if(!StringUtils.equals(curMember.getEmail(), savedMember.getEmail())) {
return false;
}
return true;
}
- 주문 취소 메소드 (변경 감지)
public void cancelOrder(Long orderId) {
Order order = orderRepository.findById(orderId).orElseThrow(EntityNotFoundException::new);
order.cancelOrder();
}
5. OrderController
- 상품을 주문한 유저가 맞는 지 검증 후 orderService.cancelOrder() 메소드 수행
// 주문번호를 받아서 주문 취소를 호출하는 메소드
@PostMapping("/order/{orderId}/cancel")
public @ResponseBody ResponseEntity cancelOrder(@PathVariable("orderId") Long orderId, Principal principal) {
if(!orderService.validateOrder(orderId, principal.getName())) {
return new ResponseEntity<String>("주문 취소 권한이 없습니다.", HttpStatus.FORBIDDEN);
}
orderService.cancelOrder(orderId);
return new ResponseEntity<Long>(orderId, HttpStatus.OK);
}
6. 구매 내역 페이지 주문 취소
- 해당 주문을 취소하도록 요청을 보내는 cancelOrder() 함수 Ajax 코드
<script th:inline="javascript">
function cancelOrder(orderId) {
var token = $("meta[name='_csrf']").attr("content");
var header = $("meta[name='_csrf_header']").attr("content");
var url = "/order/" + orderId + "/cancel";
var paramData = {
orderId : orderId,
};
var param = JSON.stringify(paramData);
$.ajax({
url : url,
type : "POST",
contentType : "application/json",
data : param,
beforeSend : function(xhr){
/* 데이터를 전송하기 전에 헤더에 csrf값을 설정 */
xhr.setRequestHeader(header, token);
},
dataType : "json",
cache : false,
success : function(result, status){
alert("주문이 취소 되었습니다.");
location.href='/orders/' + [[${page}]];
},
error : function(jqXHR, status, error){
if(jqXHR.status == '401'){
alert('로그인 후 이용해주세요');
location.href='/member/login';
} else{
alert(jqXHR.responseText);
}
}
});
}
</script>
- "주문취소" 버튼을 클릭하면 페이지를 생성할 때 미리 설정해놨던 value = "${order.orderId}" 값을 파라미터로해서 cancelOrder() 함수 호출
<button type="button" class="btn btn-outline-secondary"
th:value="${order.orderId}" onclick="cancelOrder(this.value)">주문취소</button>
7. 주문 취소 결과
'Web & Android > 스프링 부트 쇼핑몰 프로젝트 with JPA' 카테고리의 다른 글
[스프링 부트 쇼핑몰 프로젝트 with JPA] 15. 장바구니 조회 (1) | 2023.10.16 |
---|---|
[스프링 부트 쇼핑몰 프로젝트 with JPA] 14. 장바구니 담기 (0) | 2023.10.16 |
[스프링 부트 쇼핑몰 프로젝트 with JPA] 12. 구매 내역 조회 (0) | 2023.10.16 |
[스프링 부트 쇼핑몰 프로젝트 with JPA] 11. 상품 주문 (1) | 2023.10.16 |
[스프링 부트 쇼핑몰 프로젝트 with JPA] 10. 상세페이지 (0) | 2023.10.16 |