본문 바로가기

개발일기/JPA

JPA API (엔티티를 DTO로 변환 , DTO로 바로 조회)

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