JPQL의 한계 : JPQL은 문자열 기반 쿼리 언어 → 컴파일 시 검증 불가, 유지보수가 어려움
QueryDSL : JPQL을 타입 안전하게 작성하기 위한 라이브러리
⇒ SQL이 아닌 JPA 위에서 동작하는 쿼리 빌더!
QueryDSL의 장점 : IDE 자동완성 지원, 컴파일 시 검증, 동적 쿼리 작성 간결화, 코드 가독성 및 유지보수성 향상
<aside> 💡
실무에서는 JPQL과 QueryDSL을 함께 사용함!
간단한 동작에는 JPQL을 사용하고, 복잡한 동작에는 QueryDSL 사용!
</aside>
build.gradle 설정
implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"
QuerydslConfig 설정
@Configuration
public class QuerydslConfig {
@PersistenceContext
private EntityManager em;
// JPA에서 쿼리를 만들어 처리했던 것을 QueryDSL에서 자동으로 할 수 있도록 설정해주는 것!
@Bean
public JPAQueryFactory jpaQueryFactory() {
return new JPAQueryFactory(em);
}
}
Q-Type 클래스 : QueryDSL의 전용 클래스
<aside> 💡
Entity vs. Q-Type 클래스
JPA : Entity를 기반으로 동작
QueryDSL : Q타입 클래스를 기반으로 동작
⇒ 하지만, 라이브러리와 Config 설정을 하면, 알아서 Q타입 클래스를 생성해줌!
확인 위치: build → classes→java.main.Entity를 생성한 패키지 위치 → QClass
</aside>
queryFactory
.select(조회대상)
.from(대상엔티티)
.where(조건)
.orderBy(정렬)
.fetch(); // 실제로 검색하라는 명령어. 이걸 사용하지 않으면 실행하지 않음!
<aside> 💡
단건 조회 시 : fetchOne(), fetchFirst() 사용 가능
→ 단, 결과가 둘 이상이면 예외 발생!
</aside>
Q-Type 활용법
컴파일 시점에 Q타입 클래스를 자동 생성