*인프런 '실전! 스프링부트와 JPA 활용2' 강의 내용에서 배운 내용을 정리한 것입니다*

 

참고: dto는 엔티티를 참조해도 괜찮다

 

1. 엔티티를 DTO로 변환하는 방법을 선택한다

2. 필요하면 페치조인으로 성능을 최적화한다 (대부분의 성능 이슈가 해결된다)

 

예시)

/OrderRepository

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();

 

==> 내가 원하는 것만 select 하고, 외부의 모습은 건드리지 않은 상태로 내부에서 원하는 것으로만 성능을 튜닝할 수 있다.

엔티티를 조회했기 때문에 비즈니스 로직을 써서 데이터 변경을 할 수 있다.

재사용성이 있다

 

3. 그래도 안되면 JPA에서 직접 DTO를 조회하는 방법을 사용한다 

 

예시)

/OrderSimpleQueryRepository

select 프로젝션에 new와 파일 경로를 설정한 다음 필요한 정보들을 다 입력한다

@Repository
@RequiredArgsConstructor
public class OrderSimpleQueryRepository {
  
      private final EntityManager em;
      
      public List<OrderSimpleQueryDto> findOrderDtos() {
          return em.createQuery(
                  "select new
  jpabook.jpashop.repository.order.simplequery.OrderSimpleQueryDto(o.id, m.name,
  o.orderDate, o.status, d.address)" +
  		" from Order o" +
        " join o.member m" +
        " join o.delivery d", OrderSimpleQueryDto.class)
		.getResultList();

   } 
 }

===> 한번에 내가 원하는 데이터를 JPQL을 짜서 가져온다. 해당 DTO에만 사용 가능하기 때문에 딱딱하다

데이터 변경 불가능하고, API 스펙이 리포지토리에 들어가 있기 때문에 논리적 계층이 깨진다(repository는 엔티티 조회 용도로 사용해야한다)

 

4. 최후의 방법은 JPA가 제공하는 네이티브 SQL이나 스프링 JDBC Template을 사용해서 SQL을 직접 사용한다 

+ Recent posts