나만의 프로젝트 배포하기 9일차

박세건·2023년 9월 20일
0

개인 프로젝트

목록 보기
9/15

이전에 주문하기 기능을 추가하기위해서 주문하기Form.html에서
controller로 값이 전달되는 것까지완료했고 해당 서비스 API 만들어서 적용시켜보자

  • 먼저 받아온 값들을 Entity로 변환(추후에 테스트를 효율적으로 하기위한 변경)
    @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);
    }
  • 해당 서비스 API
    @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또한 정상적으로 저장되었다.


이어서 구매 내역 조회 기능을 추가해보자!

profile
멋있는 사람 - 일단 하자

0개의 댓글