개념
- QueryDSL은 자바 코드로 JPQL/SQL을 타입 안전하게 작성하게 해주는 DSL 라이브러리이다.
- 즉, JPQL 빌더라고 이해하면 편하다. 빌더 패턴처럼 메서드 체이닝을 이용해서 쿼리를 좀 더 객체 지향적으로 짤 수 있도록 해주는 오픈소스 라이브러리인 것이다.
장점
- 컴파일 타임에 컬럼/조인/조건 오류를 잡을 수 있다.(오타·리팩터링에 강함..즉 디버깅이 쉽다).
- 동적 쿼리를 함수로 조립하기 쉽다.
- 조건이 있을 때만 조건 만들어서 where에 끼워 넣기 하면 된다. BooleanBuilder를 사용하는게 정석이지만 where에 끼워넣기로 구현도 가능함…이건 밑에서 볼 예정
- 참고로, where 절 안에 조건을 조립해서 넣을 경우, 조건 자체를 원하는대로 조립하거나 여러 쿼리에서 재사용 하는 것도 가능하다.
- DTO 매핑, 서브쿼리, 페이징, fetch join 등 JPA 실전 패턴을 깔끔하게 표현이 가능하다.
비교
- JPQL 문자열: 간단하지만 오타·리팩터링 취약!!!!!!!!!!!!!!!
- 무조건 런타임 에러만 나기 때문에 (컴파일 에러 체킹 불가) 디버깅 매우 어려움 특히 오타…..
- JPA Criteria: 타입 안전하지만 가독성 낮음.
- 실무에서 거의 못쓸 정도로 복잡하고 가독성 너무 낮다.
- QueryDSL: 타입 안전 + 가독성을 동시에 잡는 선택지라고 할 수 있다.
동작 방식
- Q-클래스 → JPQL → SQL 식으로 돌아간다.
1. Q-클래스 생성 (컴파일 타임에 생성한다.)
- 프로젝트 빌드 시, 엔티티에 대해
QMember 같은 메타 모델을 만든다.
2. 플루언트 API로 쿼리 조립(런타임 전 단계)
JPAQueryFactory에 EntityManager를 넘겨 두고, queryFactory.selectFrom(member).where(...).join(...).fetch() 같은 식으로 메서드 체인을 만든다.
- 이때 QueryDSL은 내부적으로 JPQL AST(추상 구문 트리)를 구성한다.
3. JPQL 생성 & 바인딩(런타임)
fetch()/fetchOne() 등 터미널 연산을 호출하면