QueryDSL 설정해보기
✅ 개요
JPA의 기본적인 조회를 사용해서 쿼리를 작성했었는데, 요구사항이 점점 많아졌고 이에 따른 테이블 구조가 확장되었습니다.
외래키를 사용하지 않음에 따라 조회쿼리의 한계를 느꼈고 이번 계기를 통해 QueryDSL
를 적용해보고자 했습니다.
✅ 환경 설정
QueryDSL은 Spring (boot)에서 공식적으로 제공하는 플러그인이 아니기에 약간의 설정이 필요합니다.
1. Gradle 디펜던시 지정
// build.gradle
implementation "com.querydsl:querydsl-jpa:5.1.0:jakarta"
annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"
QueryDSL은 현재 기준 버전인 5.1.0 버전을 지정했습니다.
${dependencyManagement.importedProperties[’querydsl.version’]}
는 dependency 매니저를 통해 QueryDSL의 버전을 가져오고 참조하여 빌드합니다.
2. Qclass 설정
QueryDSL은 엔티티를 Qclass로 컴파일하여, 쿼리를 생성할 수 있는 일종의 인터페이스를 생성합니다.
하지만, 스프링 3.x 부터 컴파일시 이를 자동으로 생성해주고 있어서 별도의 설정은 필요없습니다. (편해짐:D)
저는 간단하게, 컴파일시 기존 Qclass를 삭제하는 추가적인 작업만 넣어 놨습니다.
// build.gradle
...
clean {
delete file('src/main/generated')
}
컴파일을 하게 되면 아래의 이미지와 같이 src/main/generated
밑에 Qclass가 생성됩니다.
3. QueryFactory 빈 등록하기
QueryDSL은 엔티티들을 쿼리로 활용할 수 있도록 Q타입의 객체들을 제너레이팅합니다.
여기서 Q타입들을 쿼리로 변환하는데 Query Factory를 사용합니다. 이는 인터페이스로 제공되고 구현체는 JPAQueryFactory 입니다.
이 JPAQueryFactory를 싱글톤 객체로 선언하여 사용하도록 하겠습니다.
@RequiredArgsConstructor
@Configuration
Public class QueryDSLConfig {
@PersisteceContext
private EntityManager entityManager;
@Bean
public JPAQueryFactory queryFactory() {
return new JPAQueryFactory(entityManager);
}
}
이제 우리는 service단이나, repository단에서 저 queryFactory
를 주입받아 QueryDSL 문법을 작성하면 됩니다.
QueryDSL을 처음 듣고 서칭해봤을 때는 굉장히 설정이 복잡해보였으나, 하나씩 찝어보면 별거 없는거 같았습니다. (버전업 되면서 편해진 것도 없지 않아 있는거 같고..)
다음에는 쿼리를 직접 작성하여 활용해본 경험의 정리를 해볼까 합니다