최근에 새로운 프로젝트 진행하면서 Spring Boot 3 버전을 사용하게 됐는데
해당 프로젝트의 Gradle 설정을 구성하면서 다른 분들의 예제를 보면서 작성한 내용을 공유 드립니다.
아래의 내용은 VSCode에서 진행했습니다. 다른 IDE에서는 테스트해보지 않아 다르게 동작할 수도 있는 점 양해 부탁드립니다.
먼저 Gradle 설정은 다음과 같습니다.
plugins {
id "java"
id "org.springframework.boot" version "3.0.6"
id "io.spring.dependency-management" version "1.1.0"
//querydsl 플러그인 추가하지 않음
}
...
configurations {
...
querydsl.extendsFrom compileClasspath //해당 부분은 그대로 유지
...
}
repositories {
mavenCentral()
}
dependencies {
...
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"
implementation "com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.0"
...
}
...
현재 예제에서는 Querydsl의 Gradle 플러그인인 id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"를 사용하지 않습니다.
이전 버전에도 있었는지는 정확하게 모르겠지만 Spring Boot 3로 업데이트 되면서 jakarta 패키지를 사용하기 때문에 해당 패키지에 맞는 annotationProcessor를 추가하여 Gradle의 Querydsl 태스크를 대체합니다.
(대표적으로 compileQuerydsl)
그리고 configurations 부분의 querydsl.extendsFrom compileClasspath 구문은 그대로 유지합니다.
dependencies 부분에서는 Querydsl 관련 패키지 뒤에 :jakarta를 추가로 입력하고 2 개의 annotationProcessor을 추가해줬습니다.
Spring Boot 3 초기에 지원되지 않았던 P6Spy의 경우 2월 10일에 1.9.0 버전으로 업데이트 되어 정상적으로 지원합니다.
그리고 기존에 김영한 님이 가이드 하셨던 코드인
//querydsl 추가 시작
def querydslDir = "$buildDir/generated/querydsl"
querydsl {
jpa = true
querydslSourcesDir = querydslDir
}
sourceSets {
main.java.srcDir querydslDir
}
compileQuerydsl {
options.annotationProcessorPath = configurations.querydsl
}
//querydsl 추가 끝
위 코드는 따로 작성하지 않습니다.
Querydsl Gradle 플러그인을 통해 Qclass를 생성하는 compileQuerydsl 태스크를 별도로 실행할 필요 없이 프로젝트 빌드 진행 시 annotationProcessor에 의해 Qclass가 자동으로 생성됩니다.
(여기서 프로젝트 빌드란 Gradle build 태스크가 아닌 Java workspace 빌드를 뜻함.)
아래의 이미지와 같이 @Entity 파일이 수정될 때 수정한 내용이 즉시 Qclass에 반영되는 것을 확인할 수 있습니다.
(좌측 Entity class, 우측 Qclass)
위 설정을 통해 생성되는 Qclass의 위치는 /bin/generated-sources/annotations/{프로젝트 패키지}/{Entity 클래스 패키지}입니다.
(예제 프로젝트에서 Qclass의 위치, gitignore 처리되어 있어 회색으로 표시 됨)
만약 annotationProcessor를 추가하고 Querydsl 설정을 같이 추가했다면 Qclass가 중복된다는 오류가 발생하여 프로젝트 빌드가 진행되지 않으니 주의 바랍니다.
해당 소스는 다음 링크에서 확인해보실 수 있습니다.
404-nut-pound/spring-jpa-querydsl-template (github.com)
그리고 별도로 MongoDB+Querydsl 설정도 공유해 드립니다.
404-nut-pound/spring-mongodb-querydsl-template (github.com)
MongoDB는 Gradle 패키지 설정 시 약간 달라지고 @Entity 어노테이션은 동일하게 사용합니다.
그리고 Querydsl MongoDB 패키지는 JPAQueryFactory를 지원하지 않고 Morphia 패키지를 사용해서 MorphiaQuery라는 객체를 사용하는데
공식 가이드를 봐도 해당 객체를 초기화하는 방법을 알 수 없어서 Repository 인터페이스에 QuerydslPredicateExecutor를 상속하여 사용하는 식으로 구성했습니다.
다른 곳 많이 찾아봐도 계속 에러나서 몇시간째 헤매고 있었는데 바로 잘 되네요ㅠ 감사합니다!
답글