QueryDSL 설정은 쉽지않다.
인프런 김영한 강사님의 QueryDSL 강의를 수강하고 있는 학생이라면 QueryDSL 설정에 어려움을 겪고 있을 것이라 예상된다. 아무래도 강사님이 사용하는 버전이 SpringBoot 2.2.2 버전과 QueryDSL 4.4.0 버전을 사용하고 있기에 그렇다. 현재 https://start.spring.io/ 에서 제공하는 SpringBoot 버전은 2.6 이상이거나 3.x 버전이다.
- 스프링 부트 3.x 버전
- 스프링 부트 2.6 이상 버전
SpringBoot 2.6 이상, 3.x 버전 모두 QueryDSL 5.0.0 버전에 의존한다. 게다가 3.x 버전의 경우, 지원하는 패키지명이 javax에서 jakarta로 변경되었다. 이런 저런 이유로 현재 인터넷상에는 QueryDSL 설정관련 정보가 복잡하게 난립하고 있다. 그래서 이번 포스팅에서는 QueryDSL 설정을 두 가지 경우로 나누어 정리해볼까 한다.
1) SpringBoot 2.6 이상 + QueryDSL 5.0.0
build.gradle
// QueryDSL 버전정보 추가
buildscript {
ext {
queryDslVersion = "5.0.0"
}
}
plugins {
// 중략...
//querydsl 플러그인 추가
id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
}
// 중략...
dependencies {
//중략...
// QueryDSL
implementation "com.querydsl:querydsl-jpa:${queryDslVersion}"
implementation "com.querydsl:querydsl-apt:${queryDslVersion}"
implementation "com.querydsl:querydsl-core:${queryDslVersion}"
}
//QueryDSL 플로그인 설정 START
def querydslDir = "$buildDir/generated/querydsl" //QueryDSL로 생성된 소스가 저장되는 위치
querydsl {
jpa = true //JPA 사용여부 설정
querydslSourcesDir = querydslDir
}
sourceSets {
main.java.srcDir querydslDir// 빌드시 컴파일이 필요한 소스위치
}
//QueryDSL 컴파일시 참조할 설정정보
compileQuerydsl{
options.annotationProcessorPath = configurations.querydsl
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
querydsl.extendsFrom compileClasspath //외부라이브러리 컴파일 경로 상속
}
//QueryDSL 플로그인 설정 END
SpringBoot 2.6 이상을 사용하면 2가지 특징이 있다.
- QueryDSL 5.0.0 지원
- QueryDSL Gradle 플러그인 사용
Gradle 플러그인이란 Gradle에서 동작하는 Task 모음이다. QueryDSL 프레임워크는 Q타입클래스를 컴파일하여 생성해야 한다. Gradle이 QuerDSL 관련 task를 지원할 수 있도록 플러그인을 추가하고 설정하는 작업이 필요하다. 위 build.gradle을 보면 QueryDSL버전정보를 명시하고 플러그인을 추가하고 디펜던시를 추가한 뒤, QuerdyDSL Task 관련 설정이 이루어짐을 알 수 있다. 설정을 추가하고 build.gradle을 실행하면 아래와 같이 QueryDSL 관련 Task를 실행할 수 있다.
build clean을 진행하고 compileQuerydsl Task를 실행하면 지정된 위치에 아래와 같은, Q타입 클래스가 생성된다.
Q타입 클래스는 엔티티를 추적하여 자동으로 생성되는 클래스로 자세한 내용은 아래 포스팅을 참고하기를 바란다.
이렇듯, SpringBoot 2.6 이상 버전의 경우 QueryDSL 설정이 굉장히 복잡하다. QueryDSL 플러그인을 따로 추가하고 플러그인 관련 설정도 해야하기에 발생하는 문제이다.
2) SpringBoot 3.x + QueryDSL 5.0.0
build.gradle
//중략 ...
dependencies {
//중략 ...
//querydsl dependencies 추가(스프링부트 3.0 이상)
implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"
}
def querydslSrcDir = 'src/main/generated'
clean {
delete file(querydslSrcDir)
}
tasks.withType(JavaCompile) {
options.generatedSourceOutputDirectory = file(querydslSrcDir)
}
SpringBoot 3.x 버전을 사용하면 세 가지 특징이 있다.
1) jakarta 패키지명 사용
2) QueryDSL 플러그인 사용 X
3) QueryDSL 버전 명시 X
SpringBoot 3.x 버전은 확실히 2.6이상 버전보다 설정이 간단해졌다.
SpringBoot 3.x 버전은 QueryDSL 플러그인을 추가하지 않기 때문이다. 그렇다면 Q타입클래스 생성을 어떻게 해야할까? 위 설정을 보면 알겠지만, JavaCompile Task와 같이 동작하도록 설정해놓았다. 즉, 따로 플러그인을 추가하지 않고 Gradle 내부 Task와 같이 동작하도록 변경된 것이다.
build clean을 진행하고 complieJava Task를 실행해보자.
컴파일하거나 빌드를 진행하면 지정된 위치에 Q타입 클래스가 생성됨을 확인할 수 있다.
이렇듯, QueryDSL 설정은 버전별로 상이하고 QueryDSL 동작방식에 대한 이해도 필요하기에 여간 까다로운 것이 아니다. 아직 Gradle 에 대한 지식이 부족하고 QueryDSL 및 SpringBoot에 대한 이해도 많이 부족하기에 깊은 내용은 정리하지 못했다. 공부를 하고 알게 되는 내용이 있으면 추가하여 올리도록 하겠다.
참고자료
'JPA > QueryDSL' 카테고리의 다른 글
[QueryDSL] Expression( 표현 ) (0) | 2023.08.04 |
---|---|
[QueryDSL] QueryDSL 동작원리(3) - fetch (0) | 2023.08.02 |
[QueryDSL] QueryDSL 동작원리(2) - 메타데이터 설정하기 (0) | 2023.08.01 |
[QueryDSL] QueryDSL 동작원리(1) - 빌더패턴 (0) | 2023.07.28 |
[QueryDSL] QueryDSL이란? (0) | 2023.07.21 |