주문 조회 V1: 엔티티 직접 노출

주문 내역에서 주문한 상품 정보를 추가로 조회해본다. Order 기준으로 컬렉션인 OrderItem, Item 이 필요하다. Order->OrderItem->Item : 아이템 이름 출력 =>주문한 내역주문한 상품명(주문상품.getName) 함께 출력해본다.

List<OrderItem> orderItems = order.getOrderItems();
orderItems.stream().forEach(o -> o.getItem().getName());

Hibernate5Module는 지연로딩해서 프록시 객체는 초기화해서 초기화된 프록시 객체만 반환한다. 조회하려는 객체가 지연로딩(LAZY)이면 프록시 객체 강제 초기화해서 진짜 엔티티 데이터를 가져온다! Hibernate는 지연로딩인 애들은 데이터를 안 뿌린다. 하지만 강제 초기화된 프록시객체들은 뿌린다! 단, 양방향 관계들은 한쪽에 @JsonIgnore를 붙여서 무한 루프에 빠지지 않도록 한다! ex) Member->Team->List<Member>

알고리즘 순서

  1. Order 엔티티(List<Order>) 조회 : orderRepository에서 데이터 모두 가져온다.

  2. 1의 List<Order>에서 각각의 Order 객체의 데이터 조회 ① 주문 회원 이름 ② 배송지 정보 ③ 주문 상품들 => stream과 foreach문을 이용해서 주문한 상품들(List<OrderItem>) 컬렉션에서 각 주문 상품(OrderItem)의 상품명 조회

1. 람다식 표현 사용

@GetMapping("/api/v1/orders")
    public List<Order> ordersV1() {
        List<Order> all = orderRepository.findAllByCriteria(new OrderSearch());
        //프록시 객체에 접근하여 강제 초기화.
        for (Order order : all) {
            order.getMember().getName();
            order.getDelivery().getAddress();
            List<OrderItem> orderItems = order.getOrderItems();
            orderItems.stream().forEach(o -> o.getItem().getName());
        }
        return all;
    }

2. for문 표현

@GetMapping("/api/v1/orders")
    public List<Order> ordersV1() {
        List<Order> all = orderRepository.findAllByCriteria(new OrderSearch());
        //프록시 객체에 접근하여 강제 초기화.
        for (Order order : all) {
            order.getMember().getName();
            order.getDelivery().getAddress();

            List<OrderItem> orderItems = order.getOrderItems();
            for (OrderItem orderItem : orderItems) {//위 표현이 더 가독성이 좋은 람다식.
                orderItem.getItem().getName();
            }
        }
        return all;
    }

Last updated