20201217

QueryDSL 우아콘 이동욱님 세션

QueryDSL 의 exist 메소드 쓰지 않기

  • queryDsl exists 메소드는 sql exsist 를 쓰지 않는다.
    • sql exist 는 하나를 찾자마자 멈추기 때문에 효율적.
  • 그래서 query dsl exsist 메소드나, fetchCount > 1 보다
  • fetchFirst 가 더 효율적이다!
    • 왜냐면 하나를 찾자마자 멈추는 효과때문에

이미 아는 값을 조회하지 말자. as 표현식으로 대체할 수 있다. asString, asNumber

Projcetions.fields(BookPageDto.class,
                   book.name,
                   Expressions.asNumber(bookNo).as("bookNo"),
                   book.id)

Select 절에 Entity 조회를 굳이 안해도 되는지 생각해보기

  • projections 로 dto 를 가져올 때 id 만 조회해와서
    • adItem.customer.id.as(“customerId”)
  • toEntity() 메소드 시 .customer(new Customer(customerId))
  • 이렇게 ID 만 같은 객체를 생성해도 저장할 때 문제가 없다. 는데 customer 가 다 null 로 저장되지는 않으려나?

group by 최적화

  • file sort 제거를 위하여
  • order by null 직접 구현하여 넣어주기
  • (Order.ASC, NullExpression.DEFAULT, Default);
  • 페이징일 경우 order by null 을 사용하지 못한다.

정렬

  • 조회 결과가 100건 이하라면, 애플리케이션 정렬이 유리하다.

커버링 인덱스

  • JPQL 은 from 절의 서브쿼리를 사용하지 못하므로
  • DB 를 두번치는 방법을 사용한다.
    • id 만 조회하는 쿼리
    • 두번째 진짜 조회
      • where 절에 in 구문에 위 ID 리스트

JPA Bulk inset 는 자제한다.