스프링 부트의 버전이 3.0으로 올라가면서 QueryDsl의 설정방법이 달라져서 공유 + 메모할 겸 글을 쓴다.
querydsl단독으로 쓸 때는 아니고, spring data jpa와 같이 쓰는 경우이다.
- OS: Ubuntu20.04 (wsl)
- IDE: IntelliJ
- Jdk: openjdk 17버전
- Gradle언어: Groovy
plugins {
id 'java'
id 'org.springframework.boot' version '3.0.0'
id 'io.spring.dependency-management' version '1.1.0'
// querydsl관련 명령어를 gradle탭에 생성해준다. (권장사항)
id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
}
group = 'sample'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.mysql:mysql-connector-j'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
// === QueryDsl 시작 ===
// == 스프링 부트 3.0 이상 ==
implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
// == 스프링 부트 3.0 미만 ==
implementation 'com.querydsl:querydsl-jpa'
annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jpa"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"
// === QueryDsl 끝 ===
}
tasks.named('test') {
useJUnitPlatform()
}
// === Querydsl 빌드 옵션 (선택사항) ===
def querydslDir = "$buildDir/generated/querydsl"
querydsl {
jpa = true
querydslSourcesDir = querydslDir
}
sourceSets {
main.java.srcDir querydslDir
}
configurations {
querydsl.extendsFrom compileClasspath
}
compileQuerydsl {
options.annotationProcessorPath = configurations.querydsl
}
dependencies
에서 주석처리한 부분을 잘 설정하면 된다.querydsl-jpa
, querydsl-apt
라이브러리를 명시해주는 방법이 변경됐다.jakarta.annotation-api
와 jakarta.persistence-api
는 아래와 같은 에러를 방지하기 위해서 추가해준다.java.lang.NoClassDefFoundError:javax/persistence/Entity
querydslDir
옵션은 Q클래스들을 빌드 폴더 안으로 빌드되게 할 수 있어서 유용하다 ㅎㅎ 2023-03-06에 추가함
위에서 안내하고 있는 Gradle 설정은 Querydsl 플러그인
을 사용하도록 되어 있는데, gradlew
로 빌드할 때, 문제가 있어서 플러그인은 사용하면 안된다!!!
Spring을 로컬에서 실행, 빌드하는 건 되지만 배포를 위해 gradlew
를 사용해서 빌드를 하면, 동일한 Q파일을 생성하지말라고 에러가 뜬다.
(이 문제를 해결을 하는데 한~~참 걸렸다. 😂)
검색을 해보면 거의 대부분, Querydsl플러그인을 사용해서 build.gradle을 작성하는 것을 많이들 알려주고 있는 것 같다... ㅠㅠ
다들 나처럼 고생을... 좀... 할 것 같다 😂
아무튼 위와 같이 build.gradle
을 설정하면 안되고, 아래와 같이 설정해야한다. 꼭!꼭!꼭!
plugins {
id 'java'
id 'org.springframework.boot' version '3.0.3'
id 'io.spring.dependency-management' version '1.1.0'
// id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" // ⭐ Querydsl 플러그인 사용 X
}
group = 'sample'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.mysql:mysql-connector-j'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
// ⭐ Spring boot 3.x이상에서 QueryDsl 패키지를 정의하는 방법
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"
}
tasks.named('test') {
useJUnitPlatform()
}
// === ⭐ QueryDsl 빌드 옵션 (선택) ===
def querydslDir = "$buildDir/generated/querydsl"
sourceSets {
main.java.srcDirs += [ querydslDir ]
}
tasks.withType(JavaCompile) {
options.annotationProcessorGeneratedSourcesDirectory = file(querydslDir)
}
clean.doLast {
file(querydslDir).deleteDir()
}
3.0으로 프로젝트 진행하면서 막혔는데 감사합니다!