728x90
반응형
김영한님의 실전! QueryDSL 강의를 보던 도중 QueryDSL이 다음과 같이 QueryDSL 컴파일 시도시 예외를 발생하는 것을 볼 수 있었습니다.
java.lang.NoClassDefFoundError: javax/persistence/Entity
현재 스프링 부트 3.0을 사용하고 있었고 querydsl 의존성을 다음과 같이 변경하였습니다.
plugins {
id 'java'
id 'org.springframework.boot' version '3.0.0'
id 'io.spring.dependency-management' version '1.1.0'
}
group = 'com.example'
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'
// Spring boot 3.0 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"
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.h2database:h2'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
tasks.named('test') {
useJUnitPlatform()
}
// Querydsl 설정부
def generated = 'src/main/generated'
// querydsl QClass 파일 생성 위치를 지정
tasks.withType(JavaCompile) {
options.getGeneratedSourceOutputDirectory().set(file(generated))
}
// java source set 에 querydsl QClass 위치 추가
sourceSets {
main.java.srcDirs += [ generated ]
}
// gradle clean 시에 QClass 디렉토리 삭제
clean {
delete file(generated)
}
원인
스프링 부트 3.0 부터는 javax 패키지가 jakarta로 변경되어 잘못된 의존성(javax 패키지로 불러옴)을 불러와서 예외가 발생하는 문제였습니다.
그래서 의존성을 다음과 같이 변경하였습니다.
// 이전 설정
implementation "com.querydsl:querydsl-jpa:${queryDslVersion}"
annotationProcessor "com.querydsl:querydsl-apt:${queryDslVersion}"
// 현재 설정
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"
그리고 해당 의존성만 추가시 Q클래스 파일을 못불러오기 때문에 src/main에 QClass가 생성될 수 있도록 다음 설정을 추가했습니다.
// Querydsl 설정부
def generated = 'src/main/generated'
// querydsl QClass 파일 생성 위치를 지정
tasks.withType(JavaCompile) {
options.getGeneratedSourceOutputDirectory().set(file(generated))
}
// java source set 에 querydsl QClass 위치 추가
sourceSets {
main.java.srcDirs += [ generated ]
}
// gradle clean 시에 QClass 디렉토리 삭제
clean {
delete file(generated)
}
위의 설정을 완료하면 잘 빌드되는 것을 확인할 수 있습니다.
이제 src/main/generated에 QClass가 Git에 올라가지 않도록 .gitignore에 다음 구문을 추가해줍시다.
**/generated
참고자료
https://www.inflearn.com/chats/700670/querydsl-springboot-3-0의-gradle-설정을-공유합니다
반응형
'Java > Spring' 카테고리의 다른 글
스프링에서 어떻게 캐싱이 이루어질까? - 1편 스프링에서 캐싱 사용하기 (1) | 2024.08.04 |
---|---|
@RequestBody로 지정한 DTO에 기본생성자가 필요한 이유 (2) | 2022.10.11 |
스프링 빈과 스프링 컨테이너 (0) | 2022.09.04 |
IoC와 DI, 그리고 의존성 주입을 위한 방법들 (2) | 2022.08.29 |
OpenApi Spec을 이용한 RestDocs to Swagger 변환 자동화 (1) | 2022.07.28 |