728x90
반응형
엔티티를 DTO로 변환하여 출력(with.fetch join)
- controller
@GetMapping("/api/v3/simple-orders")
public Result ordersV3() {
List<order> result = or.findAllWithMemberDelivery();
List<SimpleOrderDto> dto = result.stream()
.map(o -> new SimpleOrderDto(o))
.collect(Collectors.toList());
return new Result(dto);
}
@Data
@AllArgsConstructor
static class SimpleOrderDto{
private Long orderId;
private String name;
private LocalDateTime orderDate;
private orderstatus orderStatus;
private address address;
public SimpleOrderDto(order o) {
orderId = o.getId();
name = o.getMember().getName();
orderDate = o.getOrderDate();
orderStatus = o.getStatus();
address = o.getDelivery().getAddress();
}
}
@Data
@AllArgsConstructor
static class Result<T>{
private T data;
}
- Repository
public List<order> findAllWithMemberDelivery() {
return em.createQuery("select o from order o"+
" join fetch o.member m"+
" join fetch o.delivery d",order.class)
.getResultList();
}
- 코드해설
- Repository 에서 fetch join 을 이용하여 리스트를 조회 한후 조회된 엔티티를 SimpleOrderDto 로 람다 형식을 이용하여 변환하였음
- 마지막으로 Result 클래스로 DTO 를 감싸 return 함
- 이렇게 하는 이유는 엔티티를 외부로 보여주는것이 좋지 않아 DTO로 변환후 외부로 뿌려주었음
DTO로 바로 조회
- controller
@GetMapping("/api/v4/simple-orders")
public Result ordersV4() {
return new Result(or.findOrderDtos());
}
@Data
@AllArgsConstructor
static class Result<T>{
private T data;
}
- Repository
public List<SimpleOrderQueryDto> findOrderDtos(){
return em.createQuery("select new jpabook.jpashop.SimpleOrderQueryDto(o.id,m.name,o.orderDate,o.status,d.address) from order o join o.member m join o.delivery d",SimpleOrderQueryDto.class)
.getResultList();
}
- 코드해설
- Repository 에서 createQuery를 작성할때 select 절에 엔티티 별칭이 아닌 DTO의 디렉토를 입력하여 바로DTO 로 조회
기타
- V3보다 V4가 성능상으로는 더 유리한면이 있지만 V4는 DTO로 바로 조회하기 때문에 활용성이 V3보다는 떨어지며 데이터를 수정할 수 없다.
- 쿼리 방식 선택 권장순서
- 1, 우선 엔티티를 DTO로 변환하는 방법을 선택한다.
- 2, 필요하면 fetch join으로 성능을 최적화 한다. - > 대부분의 성능 이슈가 해결된다.
- 3, 그래도 안되면 DTO로 직접 조회하는 방법을 사용한다.
- 4, 최후의 방법은 JPA가 제공하는 네이티브 SQL 이나 스프링 JDBC Template을 사용해서 SQL을 직접 사용한다.
728x90
반응형
'개발일기 > JPA' 카테고리의 다른 글
JPA 기본 (0) | 2023.07.20 |
---|---|
JPQL 조회 TEST (0) | 2023.07.03 |