이전 글 : JPA 연관관계
에서 마지막에 실무에서는 QueryDSL 을 많이 쓴다고 했다.
이번엔 그 이유에 대해서 알아보도록 하겠다.
QueryDSL은 Java 기반으로SQL과 유사한 쿼리를 타입 안전하게 작성할 수 있게 해주는 도메인 특화 언어이다.
위 Introduction 내용을 보면 다음과 같다.
1. "타입 안정성 있는 방식으로 SQL-like 쿼리를 자바 코드로 작성할 수 있게 하는 것이다."
2. 기존의 문자열 기반 쿼리(JPQL, SQL)의 단점을 극복하고,
IDE 자동 완성과 컴파일 타임 오류 검출이 가능하도록 설계된다.
Querydsl was born out of the need to maintain HQL queries in a typesafe way.
Querydsl은 HQL 쿼리를 타입안전하게 유지할 필요성에서 탄생했다
(HQL 쿼리)를 타입안전하게 유지할 필요가 있다는 것이 무슨 말일까?
하이버네이트 쿼리 언어는 아래와 같이 작성할 수 있다.
String query = "SELECT m FROM Member m WHERE m.age > 20";
다음과 같은 코드가 있다면 어떤 문제가 있을까?
1. 오타가 발생할 수 있다.
2. 컴파일 하기 전까지는 오류가 있는 지 모른다.
DSL 을 쓴다면? -------------------------------------------
QMember m = QMember.member;
queryFactory.selectFrom(m)
.where(m.age.gt(20))
.fetch();
build.gradle 에 다음과 같은 종속성을 추가한다.

Configuration 으로 등록해준다.

제로 카테고리를 가진 콜라를 5개 이상 구매한 회원들을 조회하고 싶다.
단, 날짜 상관없이 모든 회원을 조회
select
from
where
group by having
Type Safety 생성된 Q타입을 사용하여 쿼리를 구성함으로써, 컴파일 타임에 타입을 검사할 수 있습니다. Fluent API 유창한 API(Fluent API)는 쿼리 구성 과정을 직관적이고 읽기 쉽게 만들어줍니다. Multi-Backend Support QueryDSL은 JPA, SQL, MongoDB 등 다양한 백엔드를 지원합니다. Integration Spring Data JPA와 자연스럽게 통합되어, 스프링 기반 애플리케이션에서 강력한 쿼리 기능을 제공합니다.
QueryDSL은 뛰어난 타입 안정성과 빠른 개발 속도를 제공할 수 있지만, 모든 개발 상황에 적합한 도구는 아닙니다. 예를 들어, QueryDSL은 도메인 중심(Domain-centric) 접근 방식으로 설계되어 있기 때문에, 애플리케이션이 관계형 데이터 모델(Relational Model)을 중심으로 작동하는 경우에는 QueryDSL이 적절한 선택이 아닐 수 있습니다. 이와 관련하여, QueryDSL은 기존 애플리케이션을 개선하거나 확장하는 환경에도 잘 맞지 않습니다. (이러한 상황은 생각보다 매우 흔합니다.) 기존 애플리케이션은 보통 이미 정의된 데이터베이스 모델을 가지고 있으며, 이 구조에 QueryDSL을 적용하려면 데이터 모델과 정확히 매핑되는 객체 클래스들을 새로 작성해야 하므로, 런타임 오류 가능성도 커지고, 상당히 번거로운 작업이 될 수 있습니다.정리 하면 ?
QueryDSL은 타입 안정성과 빠른 개발에 유리하지만, 도메인 중심 설계에 최적화되어 있어 관계형 모델 중심이거나 기존 시스템에 적용할 때는 클래스 매핑 부담이 크고 런타임 오류 가능성도 높다.
이 부분에서 JPAQueryFactroy 가
jakarta를 받는게 아닌javax를 받고 있어서 실패하던 문제가 있었으나, 의존성 문제로 해결되었다.