해결된 질문
작성
·
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으로 프록시 초기화를 한 게 아닐까 생각합니다!
감사합니다.
수고 많으십니다! 친절한 답변 감사드립니다.