인프런 커뮤니티 질문&답변

푸헹헹님의 프로필 이미지
푸헹헹

작성한 질문수

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

주문 조회 V2: 엔티티를 DTO로 변환

GET /api/v2/orders 조회 관련 질문

해결된 질문

작성

·

329

0

@GetMapping("/api/v2/orders")
    public List<OrderDto> ordersV2() {
        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<OrderItem> orderItems;

        public OrderDto(Order order) {
            orderId = order.getId();
            name = order.getMember().getName();
            orderDate = order.getOrderDate();
            orderStatus = order.getStatus();
            address = order.getDelivery().getAddress();
            order.getOrderItems().stream().forEach(o -> o.getItem().getId());
            orderItems = order.getOrderItems();
        }
    }

위 코드에서 OrderDto 생성자 함수 내에 getOrderItem 요소들을 순회시, 각 아이템을 get후에 getId를 호출 할 때 각 item 프록시들이 초기화 돼야 하는 것 아닌가요..? 강의에서는 getName을 통해 초기화 하길래, 위 코드처럼 getId로 하면 될까 궁금증이 생겨 실행해보니 

orderItems 내에 item 이 null 값으로 나옵니다. getName 으로 초기화 할 때는 전부 다 들어있구요.

코드 구글 드라이브 링크: https://drive.google.com/drive/folders/17gdIodVzIPG8_XzTeYUVDbLdaScP6c2s

답변 1

2

안녕하세요. ckrt4815님, 공식 서포터즈 y2gcoder입니다.

먼저 깔끔하게 정리한 글이 있어 공유드립니다.

요약해서 말씀드리자면, 프록시는 이미 식별자 값을 보관하고 있기 때문에 getId()로는 초기화가 되지 않은 것으로 보입니다. 그래서 영한님께서도 pk가 아닌 name으로 프록시 초기화를 한 게 아닐까 생각합니다!

감사합니다.

푸헹헹님의 프로필 이미지
푸헹헹
질문자

수고 많으십니다! 친절한 답변 감사드립니다.

푸헹헹님의 프로필 이미지
푸헹헹

작성한 질문수

질문하기