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

황인찬·2024년 8월 4일
post-thumbnail

인터페이스 지원 - QuerydslPredicateExecutor

  • QuerydslPredicateExecutor 인터페이스
public interface QuerydslPredicateExecutor<T> {
    Optional<T> findOne(Predicate predicate);

    Iterable<T> findAll(Predicate predicate);

    Iterable<T> findAll(Predicate predicate, Sort sort);

    Iterable<T> findAll(Predicate predicate, OrderSpecifier<?>... orders);

    Iterable<T> findAll(OrderSpecifier<?>... orders);

    Page<T> findAll(Predicate predicate, Pageable pageable);

    long count(Predicate predicate);

    boolean exists(Predicate predicate);

    <S extends T, R> R findBy(Predicate predicate, Function<FluentQuery.FetchableFluentQuery<S>, R> queryFunction);
}
  • 리포지토리에 적용
public interface MemberRepository extends JpaRepository<Member, Long>, MemberRepositoryCustom, QuerydslPredicateExecutor<Member> {
    //select m from Member m where m.username = ?
    List<Member> findByUsername(String username);
}
Iterable<Member> result = memberRepository.findAll(
		member.age.between(10, 40).and(member.username.eq("member1")));
  • 한계점
    • 조인X(묵시적 조인은 가능하나 left join은 안됨)
    • 클라이언트가 Querydsl에 의존. 서비스 클래스가 Querydsl에 의존해야함
    • 복잡한 실무에서 사용하기에는 한계가 명확함

Querydsl Web 지원

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

리포지토리 지원 - QuerydslRepositorySupport

  • 장점
    • getQuerydsl().applyPagination() : 스프링 데이터가 제공하는 페이징을 Querydsl로 편리하게 변환 가능(단! Sort는 오류발생)
    • from()으로 시작 가능(최근에는 QueryFactory를 사용해서 select()로 시작하는 것이 더 명시적임)
    • EntityManager 제공
  • 단점
    • Querydsl 3.x버전을 대상으로 만듦
    • Querydsl 4.x에 나온 JPAQueryFactory로 시작할 수 없음
      • select로 시작할 수 없음(from으로 시작해야함)
    • QueryFactory를 제공하지 않음
    • 스프링 데이터 sort 기능이 정상 작동하지 않음
profile
찬이's 개발로그

0개의 댓글