1. QueryDSL 개념

JPQL의 한계 : JPQL은 문자열 기반 쿼리 언어 → 컴파일 시 검증 불가, 유지보수가 어려움

QueryDSL : JPQL을 타입 안전하게 작성하기 위한 라이브러리

⇒ SQL이 아닌 JPA 위에서 동작하는 쿼리 빌더!

QueryDSL의 장점 : IDE 자동완성 지원, 컴파일 시 검증, 동적 쿼리 작성 간결화, 코드 가독성 및 유지보수성 향상

<aside> 💡

실무에서는 JPQL과 QueryDSL을 함께 사용함!

간단한 동작에는 JPQL을 사용하고, 복잡한 동작에는 QueryDSL 사용!

</aside>

QueryDSL 설정

  1. 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"
    
  2. QuerydslConfig 설정

    @Configuration
    public class QuerydslConfig {
    
        @PersistenceContext
        private EntityManager em;
    
    		// JPA에서 쿼리를 만들어 처리했던 것을 QueryDSL에서 자동으로 할 수 있도록 설정해주는 것!
        @Bean
        public JPAQueryFactory jpaQueryFactory() {
            return new JPAQueryFactory(em);
        }
    }
    

Q-Type란?

Q-Type 클래스 : QueryDSL의 전용 클래스

<aside> 💡

Entity vs. Q-Type 클래스

JPA : Entity를 기반으로 동작

QueryDSL : Q타입 클래스를 기반으로 동작

⇒ 하지만, 라이브러리와 Config 설정을 하면, 알아서 Q타입 클래스를 생성해줌!

확인 위치: buildclassesjava.main.Entity를 생성한 패키지 위치QClass

</aside>

[실습] JPQL로 작성한 쿼리를 QueryDSL로 리팩토링하기

2. QueryDSL 검색 기능 구현

QueryDSL 기본 구조

queryFactory
    .select(조회대상)
    .from(대상엔티티)
    .where(조건)
    .orderBy(정렬)
    .fetch(); // 실제로 검색하라는 명령어. 이걸 사용하지 않으면 실행하지 않음!

<aside> 💡

단건 조회 시 : fetchOne(), fetchFirst() 사용 가능

→ 단, 결과가 둘 이상이면 예외 발생!

</aside>

Q-Type 활용법

컴파일 시점에 Q타입 클래스를 자동 생성