항해99/개발일지

20220221 개발일지 #주문조회하기

paran21 2022. 2. 21. 23:49

오늘은 추가로 다 구현하지 못한 기능들을 같이 완성했다.

프론트에서도 작업이 빨리 끝나서, 실질적으로 처음 잡은 기능들을 완성되었다.

API 명세에는 없었지만, 주문 조회하기 기능도 만들어 놓으면 좋을 것 같아서 추가로 구현했다.

responseDto를 새로 만들어서 기존의 Cart조회와 유사하게 리턴되게 하였다.

@AllArgsConstructor
@Getter
public class OrderResponseDto {

    private Long orderId;
    private String createdAt;
    private List<ProductResponseDto> product;
    private Long totalPrice;
    private Long deliveryFee;
    private String state;
    
}

처음에 구현한 뒤에 ProductResponseDto에 해당 주문의 상품만 담겨야 하는데 모든 상품이 담기는 문제가 있었다.

Order를 만들때 잘못 담은 건가 했는데, DB를 살펴보니 그 문제는 아니었고 디버깅을 해보니 List가 초기화되지 않고 계속 추가만 되면서 발생한 문제였다.

List<ProductResponseDto>를 for문 안에서 초기화되게 설정해서 문제를 해결하였다.

@Transactional
public List<OrderResponseDto> getOrders(UserDetailsImpl userDetails) {
    //LazyInitializationException 발생 -> repository로 조회시 해결
    List<Order> orderList = orderRepository.findAllByUser(userDetails.getUser());
    List<OrderResponseDto> orderResponseDtoList = new ArrayList<>();
    for(Order order : orderList) {
        List<ProductResponseDto> productResponseDtoList = new ArrayList<>();
        for(ProductInCart productInCart : order.getProductInCartList()) {
                ProductResponseDto productResponseDto = new ProductResponseDto(
                        productInCart.getProduct());
                productResponseDtoList.add(productResponseDto);
        }
        OrderResponseDto orderResponseDto = new OrderResponseDto(
                order.getId(),
                order.getCreatedAt(),
                productResponseDtoList,
                order.getTotalPrice(),
                order.getDeliveryFee(),
                order.getState());
        orderResponseDtoList.add(orderResponseDto);
    }
    return orderResponseDtoList;
}

처음에 orderList를 조회할 때 user에서 가져오니 LazyInitializationException이 발생했다.

이전에 Cart에서와 동일하게 EAGER로 바꿔줬는데, 이번에는 다른 exception이 발생하였다.

order의 경우 user와 양방향으로 연결되어 있기 때문에 user로 orderList를 찾아오니 문제가 해결되었다.

cart와 productincart의 경우 비즈니스 로직상 함께 로딩되도 크게 문제가 되지 않을 것 같은데 user의 경우 굳이 매번 모든 orderList가 조회될 필요는 없을 것 같다.

repository에서 바로 조회하면 일단 문제가 발생하지는 않는 것 같다.