오봉이와 함께하는 개발 블로그
JPA 2 - 간단한 주문 조회 V2 : 엔티티를 DTO로 변환 본문
728x90
간단한 주문 조회 V2: 엔티티를 DTO로 변환
@GetMapping("/api/v2/simple-orders")
public List<SimpleOrderDto> ordersV2() {
List<Order> orders = orderRepository.findAllByCriteria(new OrderSearch());
List<SimpleOrderDto> result = orders.stream()
.map(o -> new SimpleOrderDto(o)) // a -> b로 바꿈.
.collect(Collectors.toList());
return result;
}
@Data
static class SimpleOrderDto {
private Long orderId;
private String name;
private LocalDateTime orderDate;
private OrderStatus orderStatus;
private Address address;
public SimpleOrderDto(Order order) {
orderId = order.getId();
name = order.getMember().getName();
orderDate = order.getOrderDate();
orderStatus = order.getStatus();
address = order.getDelivery().getAddress();
}
}
{
"orderId": 4,
"name": "userA",
"orderDate": "2022-09-04T21:54:35.695742",
"orderStatus": "ORDER",
"address": {
"city": "서울",
"street": "1",
"zipcode": "1111"
}
},
{
"orderId": 11,
"name": "userB",
"orderDate": "2022-09-04T21:54:35.752488",
"orderStatus": "ORDER",
"address": {
"city": "진주",
"street": "2",
"zipcode": "2222"
}
}
]
- 엔티티를 DTO로 변환하는 일반적인 방법이다.
- 쿼리가 총 1 + N + N번 실행된다(v1과 쿼리 수 결과는 같음)
- order 조회 1번(order 조회 결과 수가 N이 됨.)
- order -> member 지연 로딩 조회 N 번
- order -> delivery 지연 로딩 조회 N 번
- 예 : order의 결과가 4개면 최악의 경우 1 + 4 + 4번 실행된다.(최악의 경우)
- 지연로딩은 영속성 컨텍스트에서 조회하므로, 이미 조회된 경우 쿼리를 생략한다.
LAZY
를 EAGER
로 변경하면 N+1문제가 해결되지 않을까?
-> 해결되지 않는다. 오히려 예상치 못한 쿼리들이 나가서 더 안 좋은 결과가 생긴다.
인프런 김영한 지식공유자님 강의 - 실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
728x90
'BE > JPA' 카테고리의 다른 글
JPA 2 - 간단한 주문 조회 V4 : JPA에서 DTO로 바로 조회 (0) | 2022.09.05 |
---|---|
JPA 2 - 간단한 주문 조회 V3 : 엔티티를 DTO로 변환 (페치 조인 최적화) (0) | 2022.09.04 |
JPA 2 - 간단한 주문 조회 V1 : 엔티티 직접 노출 (0) | 2022.09.04 |
JPA 2 - API 개발 고급 : 조회용 샘플 데이터 입력 (0) | 2022.09.04 |
JPA 2 - 회원 조회 API (0) | 2022.09.04 |
Comments