이전에 주문하기 기능을 추가하기위해서 주문하기Form.html에서
controller로 값이 전달되는 것까지완료했고 해당 서비스 API 만들어서 적용시켜보자
@PostMapping("/api/order")
private Long save(OrderSaveRequestDto orderSaveRequestDto, @LoginMember SessionMember loginMember) {
Item item = itemRepository.findById(orderSaveRequestDto.getItemResponseDto().getId()).orElseThrow(() -> new IllegalArgumentException("해당 ID는 존재하지 않습니다!"));
int count = orderSaveRequestDto.getCount();
Member member = memberRepository.findByEmail(loginMember.getEmail()).orElseThrow(() -> new IllegalArgumentException("해당 이메일은 존재하지 않습니다"));
return orderService.save(item,member,count);
}
@Transactional
public Long save(Item item,Member member,int count) {
Order order = Order.builder()
.date(LocalDateTime.now())
.status("주문완료")
.price(item.getPrice() * count)
.member(member)
.build();
OrderItem orderItem = OrderItem.builder()
.count(count)
.price(count * item.getPrice())
.order(order)
.item(item)
.build();
orderItemRepository.save(orderItem);
return orderRepository.save(order).getId();
}
package com.qkrtprjs.happyexercise.service;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.qkrtprjs.happyexercise.config.auth.dto.SessionMember;
import com.qkrtprjs.happyexercise.dto.ItemResponseDto;
import com.qkrtprjs.happyexercise.dto.MemberResponseDto;
import com.qkrtprjs.happyexercise.dto.OrderSaveRequestDto;
import com.qkrtprjs.happyexercise.entitiy.item.Item;
import com.qkrtprjs.happyexercise.entitiy.item.ItemRepository;
import com.qkrtprjs.happyexercise.entitiy.member.Member;
import com.qkrtprjs.happyexercise.entitiy.member.MemberRepository;
import com.qkrtprjs.happyexercise.entitiy.member.Role;
import com.qkrtprjs.happyexercise.entitiy.order.Order;
import com.qkrtprjs.happyexercise.entitiy.order.OrderItem;
import com.qkrtprjs.happyexercise.entitiy.order.OrderItemRepository;
import com.qkrtprjs.happyexercise.entitiy.order.OrderRepository;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit4.SpringRunner;
import java.time.LocalDateTime;
import static org.assertj.core.api.Assertions.assertThat;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class OrderServiceTest {
@Autowired
private OrderRepository orderRepository;
@Autowired
private OrderItemRepository orderItemRepository;
@Autowired
private OrderService orderService;
@Autowired
private ItemRepository itemRepository;
@Autowired
private MemberRepository memberRepository;
@Test
public void 주문등록() throws Exception {
//given
Member member = Member.builder()
.name("name")
.role(Role.USER)
.picture("picture")
.platform("kakao")
.email("email")
.build();
Member saveMember = memberRepository.save(member);
Item item = Item.builder()
.detail("detail")
.name("name")
.price(100)
.stock(100)
.status("status")
.imgName("imgName")
.imgPath("imgPath")
.member(saveMember)
.build();
Item saveItem = itemRepository.save(item);
int count=5;
int price = saveItem.getPrice() * 5;
//when
orderService.save(saveItem,saveMember, count);
//then
Order order = orderRepository.findAll().get(0);
OrderItem orderItem = orderItemRepository.findAll().get(0);
System.out.println(order.getStatus());
System.out.println(price);
assertThat(order.getPrice()).isEqualTo(price);
assertThat(orderItem.getPrice()).isEqualTo(price);
}
}
Resolved [org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing: private java.lang.Long com.qkrtprjs.happyexercise.controller.OrderApiController.save(com.qkrtprjs.happyexercise.dto.OrderSaveRequestDto,com.qkrtprjs.happyexercise.config.auth.dto.SessionMember)]
ajax에서 controller로 데이터를 전달하는 과정에서 발생한 오류라고생각한다. ajax로 보내는 json데이터를 확인해보면
{"item":{"id":2,"detail":"맛있따","name":"감자","price":100,"stock":100,"status":"판매가능","imgName":"6d645b2c-2bac-4e5a-9fab-ed5a3d2b84fe_캡처.PNG","imgPath":"/image/6d645b2c-2bac-4e5a-9fab-ed5a3d2b84fe_캡처.PNG","memberResponseDto":{"id":3,"name":"박세건","email":"tprjs456@naver.com","platform":"KAKAO","picture":"http://k.kakaocdn.net/dn/yV3Om/btsofOasIDI/CMp3wgTRUkL3rvwcmjpxq1/img_640x640.jpg","role":"USER","createdDate":"2023-09-19T01:11:13","updatedDate":"2023-09-19T01:11:13"},"createdDate":"2023-09-19T01:11:30","updatedDate":"2023-09-19T01:11:30"},"count":"1"}
올바른 정보가 json 형태로 전달되고있는데 오류는 Long이라는 것으로 보아 id를 전달하는 과정에서 발생한 오류같은데 아직 해결하지 못했다.
-> 결국 오타 실수 였다.url: '/api/order/' , method: 'POST', dataType: 'json', contentType: 'application/json; charset=utf-8', data: JSON.stringify(data)
이부분에서 data가 date로 되어있었고
let data={ itemResponseDto:itemForRequest, count: $("#order-count").val() } private Long save(@RequestBody OrderSaveRequestDto orderSaveRequestDto, @LoginMember SessionMember loginMember) {
itemResponseDto로 보냈어야하는데 key값을 item으로 보내서 이름이 다라서 받아오지 못했던 것이다....
사소한 실수 하나 때문에 너무 많은 시간을 허비해서 나머지 할일을 하지 못했다 반성하고 집중하자!
정상적으로 주문이 완료되었고, DB또한 정상적으로 저장되었다.
이어서 구매 내역 조회 기능을 추가해보자!