[QueryDSL] 스프링 데이터 JPA가 제공하는 Querydsl 기능

kiteB·2021년 12월 11일
0

QueryDSL

목록 보기
9/9
post-thumbnail

지금부터 소개하는 기능은 제약이 커서 복잡한 실무 환경에서 사용하기는 많이 부족하다고 한다. 그래서 어떤 기능인지 간단하게 알아보고 어떤 점이 부족한건지 알아보려고 한다!

[ 인터페이스 지원 - QuerydslPredicateExecutor ]

🔗 공식 문서

QuerydslPredicateExecutor 인터페이스

public interface QuerydslPredicateExecutor<T> {

    Optional<T> findById(Predicate predicate); //1
    
    Iterable<T> findAll(Predicate predicate); //2
    
    long count(Predicate predicate); //3
    
    boolean exists(Predicate predicate); //4
    
    // … more functionality omitted.
    
}

①: predicate와 일치하는 단일 엔티티를 찾아서 반환한다.
②: predicate와 일치하는 모든 항목을 찾아서 반환한다.
③: predicate와 일치하는 엔티티의 수를 반환한다.
④: predicate와 일치하는 엔티티가 있는지 여부를 반환한다.

리포지토리에 적용

Querydsl 지원을 사용하려면 다음과 같이 리포지토리 인터페이스에서 extend 해주자!

interface MemberRepository extends JpaRepository<User, Long>, QuerydslPredicateExecutor<User> {
}
Iterable result = memberRepository.findAll(
        member.age.between(10, 40)
                .and(member.username.eq("member1"))
);

한계점

  • 조인 ❌ (묵시적 조인은 가능하지만 left join이 불가능하다.)
  • 클라이언트가 Querydsl에 의존해야 한다. 서비스 클래스가 Querydsl이라는 구현 기술에 의존해야 한다.
  • 복잡한 실무환경에서 사용하기에는 한계가 명확하다.

📌 참고

QuerydslPredicateExecutor는 Pageable, Sort를 모두 지원하고 정상 동작한다.


[ Querydsl Web 지원 ]

🔗 공식 문서

한계점

  • 단순한 조건만 가능하다.
  • 조건을 커스텀하는 기능이 복잡하고 명시적이지 않다.
  • 컨트롤러가 Querydsl에 의존한다.
  • 복잡한 실무환경에서 사용하기에는 한계가 명확하다.

[ 리포지토리 지원 - QuerydslRepositorySupport ]

장점

  • getQuerydsl().applyPagination() 스프링 데이터가 제공하는 페이징을 Querydsl로 편리하게 반환 가능하다. (단! Sort는 오류 발생)
  • from()으로 시작하는 것이 가능하다. (최근에는 QueryFactory를 사용해서 select()로 시작하는 것이 더 명시적)
  • EntityManager 제공

한계

  • Querydsl 3.x 버전을 대상으로 만들어서 Querydsl 4.x에 나온 JPAQueryFactory로 시작할 수 없다.
  • select로 시작할 수 없다. from으로 시작해야 함!
  • QueryFactory를 제공하지 않는다.
  • 스프링 데이터 Sort 기능이 정상 동작하지 않는다.
profile
🚧 https://coji.tistory.com/ 🏠

0개의 댓글