Section 1. 상품 주문
1. 상품 재고 부족 Exception
- 상품 주문 수량보다 현재 재고의 수가 적을 때 발생시킬 Exception 정의
- 에러 메시지를 지정할 수 있는 RuntimeException 클래스 구현
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2F94270508-cf7f-435d-9ceb-fbb8ffda0bf8%2Fimage.png)
2. 상품 재고 변경
- (기존 재고 - 주문 수량 재고) 로 stockNumber 수정
- 만약 0 보다 작다면 재고가 부족한 것이므로 Exception 발생
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2F62ee41a4-4bd4-4a40-8cf4-34d3f05fff37%2Fimage.png)
3. OrderItem 객체
- 주문 상품과 주문 수량 정보를 가지고 있는 OrderItem Entity 에 객체 생성 메소드 추가
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2Ff488fc39-8b37-427a-944b-84756f54222e%2Fimage.png)
4. Order 객체
- OrderItem 객체를 연결하고 OrderItem 객체에 자신을 연결하는 메소드 추가
- OrderItem 객체를 이용하여 주문 객체를 만드는 메소드 추가
- 각 주문 상품의 TotalPrice 를 구한뒤 모두 더하는 메소드 추가
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2F51e67f61-40cc-4ed2-9a41-778fb1fd3c22%2Fimage.png)
5. 주문 정보 Dto
- 제품 상세 페이지 화면에서 보내는 주문 정보 (상품, 수량)를 위한 DTO 객체 생성
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2Fc950e88a-5bca-456c-9d74-5cd15a39a8d6%2Fimage.png)
6. OrderService
- 상품과 주문한 고객을 조회
- 주문 상품 객체 생성 -> 주문 객체 생성
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2Fb7f929c5-0f83-43a3-ab08-af40577fe9e2%2Fimage.png)
7. OrderController
- 비동기 방식으로 Json 데이터를 주고 받음
- @RequestBody : http 요청의 body 부분 데이터를 자바 객체로 변환해서 받음
- @ResponseBody : 자바 객체를 http 응답 body 부분으로 보냄 (ResponseEntity 자료형)
- 입력값에 문제가 있을 시 필드 에러 정보들을 ResponseEntity 객체에 담아서 반환
- 현재 로그인한 유저의 정보를 담고 있는 Principal 객체에서 유저의 email 추출
- 정상적으로 동작 시 생성된 주문 객체의 Id 와 상태코드 200을 보냄
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2Ffb01f539-c817-402e-ae1a-535880bdcf42%2Fimage.png)
8. 상품 주문 테스트
- 테스트 클래스 생성 및 DI
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2Fc56a8e10-204a-4f20-af60-c7cafa8c69bb%2Fimage.png)
- 상품 주문 테스트
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2F5b7b3df7-2803-4a2a-886c-4a3c885d60b6%2Fimage.png)
9. 주문 상세 페이지 수정
- 비동기 통신 방법인 Ajax 를 이용하여 주문 요청 및 응답 (Ajax 참고)
- "주문하기" 버튼을 누르면 order() 함수 스크립트를 수행하도록 지정
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2F82d5b5af-0426-4b90-b56a-32cea646780a%2Fimage.png)
- order() 함수 Ajax 코드
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2F3dfdafff-7355-445b-835e-f2b289e51f35%2Fimage.png)
- 스프링 시큐리티를 사용할 경우 CSRF 토큰 값을 자동으로 주고 받지만, Ajax 통신할 때는 직접 코드를 구현해서 CSRF 토큰을 보내야함
// 스프링 시큐리티로 인해 자동으로 보내지는 html meta 태그
<meta name="_csrf" th:content="${_csrf.token}">
<meta name="_csrf_header" th:content="${_csrf.headerName}">
// Ajax 통신할 때, csrf 토큰 값을 조회해서 직접 보내야함
var token = $("meta[name='_csrf']").attr("content");
var header = $("meta[name='_csrf_header']").attr("content");
function(xhr) { xhr.setRequestHeader(header, token);}
- 주문 성공 화면
![](https://velog.velcdn.com/images%2Fcodren%2Fpost%2Fcd9a32b1-9b63-4a97-805d-96ecdbb339ec%2Fimage.png)