본문 바로가기
카테고리 없음

QueryDSL을 사용하여 복잡한 동적 쿼리를 작성하는 방법

by jhdevtrace 2024. 10. 11.

 

쿼리DSL : 타입 안정성 있게 쿼리를 작성하여, 복잡한 동적 쿼리를 사용할 수 있는 프레임워크

  • 타입 안전성: 쿼리 문자열을 사용하지 않고, 자바 코드 기반으로 쿼리를 작성하여 컴파일 시에 타입 오류를 잡을 수 있습니다.
  • 동적 쿼리 작성: QueryDSL을 사용하면 BooleanBuilder와 Predicate 를 이용하여 여러 조건을 동적으로 조합하고, 필요한 경우에만 조건을 추가할 수 있습니다.
  • Q 클래스 사용: QueryDSL은 각 엔티티에 대해 자동으로 Q 클래스를 생성하여, 엔티티의 필드에 쉽게 접근할 수 있게 해줍니다.

 

동적 쿼리 사용 방법

  • BooleanBuilder동적으로 조건을 추가할 수 있어서, 복잡한 쿼리를 작성할 때 유용합니다. 여러 조건을 and()나 or() 쿼리문을 사용해서 논리적으로 조합하는 데 사용됩니다.
  • Predicate개별 조건을 표현하는 기본 타입으로, BooleanExpression을 통해 사용되며, where() 절에 직접 넣을 수 있는 조건을 나타냅니다.

 

 

두 개념 모두 동적 쿼리 작성에 자주 사용되며, BooleanBuilder는 조건이 많고 복잡할 때, Predicate는 간단한 조건을 조합할 때 유용합니다.

  • BooleanBuilder, Predicate 이거 있는 것은 아는데, 저는 Predicate 의 BooleanExpression 써서 구현했습니다.

 

 

쿼리 DSL 기본 설정 방법

그래들에 의존성 추가하면, Q클래스가 자동으로 빌드 디렉토리 안에 생성됩니다.

해당 Q클래스를 사용해서, 쿼리DSL에서 엔티티처럼 사용할 수 있습니다

 

 

 

왜 Q클래스 쓰는지? : 엔티티의 필드를 정의?

 

BooleanBuilder

 

jpa query factory

왜 사용하냐 : 복잡한 쿼리를 사용할 수 있고, 컴파일러 단계에서 문제를 찾을 수 있기 때문. 보통 JPA 매서드는 컴파일러에서 오류를 찾을 수 없습니다.

 

일반적인 db는 다 끝나고 알 수 있는데

Q클래스는 복사본이고

컴파일단계에서 이미 실행하지 않아도 알 수 있는 것!!

현중 질문1 : BooleanExpression 메서드들 아는 거 있냐?

contain, gt, lt, desc

equal, startWith? 도 있다

질문2 : Q클래스 알아요?

난 모름 그래서 현중님도 안알려줌