JPA

페이징 한계돌파 시, ToMany 관계를 Entity -> DTO로 표현하는 방법

쿠카이든 2022. 7. 14. 06:54
728x90
@GetMapping("/api/v3.1/orders")
public List<SimpleOrderDto> ordersV3.1() {
    // ORDER 2개
    // N + 1 -> 1 + 회원 N + 배송 N
    List<Order> orders = orderRepository.findAllByString(new OrderSearch());
    List<OrderDto> result = orders.stream()
            .map(o -> new OrderDto(o))
            .collect(Collectors.toList());

    return result;
}

@Data
static class OrderDto {
    private Long orderId;
    private String name;
    private LocalDateTime orderDate;
    private OrderStatus orderStatus;
    private Address address;
    private List<OrderItemDto> orderItems;

    public OrderDto(Order order) {
        orderId = order.getId();
        name = order.getMember().getName(); // LAZY 초기화
        orderDate = order.getOrderDate();
        orderStatus = order.getStatus();
        address = order.getDelivery().getAddress(); // LAZY 초기화
        orderItems = order.getOrderItems().stream()
                .map(orderItem -> new OrderItemDto(orderItem)) //OrderItem 엔티티를 Dto로 변환
                .collect(Collectors.toList());
    }
}

@Getter
static class OrderItemDto {

    private String itemName;
    private int orderPrice;
    private int count;
    
    public OrderItemDto(OrderItem orderItem) {
    	itemName = orderItem.getItem().getName();
        orderPrice = orderItem.getOrderPrice();
        count = orderItem.getCount();
    }
}
  • ~ToMany 관계일 때, OrderDto에서 OrderItem 엔티티를 Dto로 변환하면, 전체 조회시 OrderItem이 리스트 형식으로 각각 추가로 조회된다.
728x90