queryDsl은 사용하기가 정말 편하지만 Configuration이 좀 중구난방이라 .. 무엇을 사용하는게 좋을지 매번 헷갈려서 정리를 해보려고 합니다.
plugins {
id 'java'
id 'org.springframework.boot' version '3.1.5'
id 'io.spring.dependency-management' version '1.1.4'
}
Gradle 5.0 이상 혹은 IntelliJ 2020.x를 사용하는 경우, Gradle로 프로젝트를 빌드할 때 “동일한 Q파일을 생성하지 말라”는 에러 메시지가 나타나며, 배포 작업에서 문제가 발생합니다.
이 배포 관련된 문제로 com.ewerk.gradle.plugins.querydsl
플러그인을 사용하지 않아요!
// ⭐ 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"
// === ⭐ QueryDsl 빌드 옵션 (선택) ===
def querydslDir = layout.buildDirectory.dir("generated/querydsl").get().asFile
sourceSets {
main.java.srcDirs += [ querydslDir ]
}
tasks.withType(JavaCompile).configureEach {
options.getGeneratedSourceOutputDirectory().set(file(querydslDir))
}
clean.doLast {
file(querydslDir).deleteDir()
}
clean {
delete file('src/main/generated')
}
위에서는 2가지에 대해 deprecated된 부분에 대해 수정해주었습니다.
def generated = "$buildDir/generated/querydsl"
와 같이 작성하면 deprecated 되었다는 내용을 볼 수 있는데요 이 부분을
def generated = layout.buildDirectory.dir("generated/querydsl").get().asFile
와 같이 변경하였습니다.
그리고
tasks.withType(JavaCompile) {
options.annotationProcessorGeneratedSourcesDirectory = file(querydslDir)
}
이 부분에 대해
tasks.withType(JavaCompile).configureEach {
options.getGeneratedSourceOutputDirectory().set(file(querydslDir))
}
로 수정하였습니다.
plugins {
id 'java'
id 'org.springframework.boot' version '3.1.5'
id 'io.spring.dependency-management' version '1.1.4'
}
group = 'com.seoultech'
version = '0.0.1-SNAPSHOT'
java {
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'
// redis
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
//security
// implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
implementation 'org.springframework.boot:spring-boot-starter-security'
// 좌표 저장
// implementation 'org.hibernate', name: 'hibernate-spatial'
annotationProcessor "org.springframework.boot:spring-boot-configuration-processor"
//lombok
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
// jwt
runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.2'
runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.2'
implementation 'io.jsonwebtoken:jjwt-api:0.11.2'
// jackson
implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310'
implementation 'com.fasterxml.jackson.core:jackson-databind'
// database
runtimeOnly 'com.mysql:mysql-connector-j'
// swagger
// implementation 'org.springdoc:springdoc-openapi-ui:2.0.4'
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.4'
// gson
implementation 'com.google.code.gson:gson:2.9.0'
// ⭐ 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"
// test
developmentOnly 'org.springframework.boot:spring-boot-devtools'
testImplementation 'org.assertj:assertj-core:3.24.2'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.security:spring-security-test'
}
tasks.named('test') {
useJUnitPlatform()
}
// === ⭐ QueryDsl 빌드 옵션 (선택) ===
def querydslDir = layout.buildDirectory.dir("generated/querydsl").get().asFile
sourceSets {
main.java.srcDirs += [ querydslDir ]
}
tasks.withType(JavaCompile).configureEach {
options.getGeneratedSourceOutputDirectory().set(file(querydslDir))
}
clean.doLast {
file(querydslDir).deleteDir()
}
clean {
delete file('src/main/generated')
}