Spring
[Spring] SpringBoot + Gradle(5.x && 6.x) + Querydsl Setting
코리늬
2020. 9. 6. 17:41
SpringBoot + queryDsl Setting 총정리
스프링 버전 : 2.2.6
그래들 버전 : 6.4.1
QueryDsl 의존성을 추가해주고 프로젝트를 빌드했지만, 아래와 같은 에러가 빈번했다.
- 큐 클래스가 생성이 안됨
cannot find symbol q class
2.큐 클래스가 생성은 됐지만, 중복됨 duplicate class
장장 5일정도는 셋팅만하느라 시간을 허비한 것 같다.
처음 queryDsl 설정은 이동욱님의 블로그를 보고 참고해서 작성했었다.
첫 셋팅은 대략 아래와 같았다. 구글링을해봐도 거기서 거기인듯하다.
buildscript {
ext{
springBootVersion = '2.2.4.RELEASE'
querydslPluginVersion = '1.0.10'
}
repositories {
mavenCentral()
maven { url "https://plugins.gradle.org/m2/"}
}
dependencies {
classpath("gradle.plugin.com.ewerk.gradle.plugins:querydsl-plugin:${querydslPluginVersion}")
}
}
dependencies{
...
compile group: 'com.querydsl', name: 'querydsl-jpa' // Query DSL 추가
compile group: 'com.querydsl', name: 'querydsl-apt' // Query DSL 추가
...
}
//querydsl 적용
apply plugin: "com.ewerk.gradle.plugins.querydsl" //plugin 적용
def querydslSrcDir = 'src/main/generated' //Qclass 생성 위치
querydsl {
library = "com.querydsl:querydsl-apt"
jpa = true
querydslSourcesDir = querydslSrcDir
}
sourceSets {
main {
java {
srcDirs = ['src/main/java', querydslSrcDir]
}
}
}
하지만, 빌드시 큐 클래스를 찾을 수 없다는 에러가 나왔었다.
구글링을 통해 sourceSets 아래 코드를 추가해줬다. 그래들 5.xx이상 버전이라면 추가 설정이 필요하다고한다.
compileQuerydsl{
options.annotationProcessorPath = configurations.querydsl
}
configurations {
querydsl.extendsFrom compileClasspath
}
하지만 계속해서 큐 클래스가 중복이된다고 에러를 내뱉었다....
Querydsl은 프로젝트 내의 @Entity 어노테이션을 선언한 클래스를 탐색하고 JPAAnnotiationProcessor
를 사용해 큐클래스를 생성한다.
그래들 4.6까지는 AnnotationProcessor를 정의하는 방법에대해 구체적을 정의가 되어있지않기 때문에 작성하기 어려웠다고한다.
구글링 영끌의 결과로 변경된 Gradle annotation processor
설정 방법을 찾아 시도해봤더니 마침내 동작했다..!
최종 Gradle
plugins {
id 'org.springframework.boot' version '2.2.4.RELEASE'
id 'io.spring.dependency-management' version '1.0.9.RELEASE'
id 'java'
id "com.github.node-gradle.node" version "2.2.3"
}
group = 'com.jpa'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
...
implementation group: 'com.querydsl', name: 'querydsl-jpa' // Query DSL 추가
implementation group: 'com.querydsl', name: 'querydsl-apt' // Query DSL 추가
...
}
//querydsl 적용
//apply plugin: "com.ewerk.gradle.plugins.querydsl" //plugin 적용
//def querydslSrcDir = 'src/main/generated' //Qclass 생성 위치
//cannot find symbol은 해결됏으나 duplicate 발생
configure("querydsl-sample") {
apply plugin: "io.spring.dependency-management"
dependencies {
compile("com.querydsl:querydsl-core")
compile("com.querydsl:querydsl-jpa")
annotationProcessor("com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jpa") // querydsl JPAAnnotationProcessor 사용 지정
annotationProcessor("jakarta.persistence:jakarta.persistence-api") // java.lang.NoClassDefFoundError(javax.annotation.Entity) 발생 대응
annotationProcessor("jakarta.annotation:jakarta.annotation-api") // java.lang.NoClassDefFoundError (javax.annotation.Generated) 발생 대응
}
// Gradle clean을 하게되면 생성된 generated 아래 Q클래스 파일이 삭제된다
clean {
delete file('src/main/generated') // 인텔리제이 큐 클래스 경로
}
}