문제 발생

기존에 gradle-groovy 방식을 주로 썼는데 이번에 gradle-kotlin 방식을 써보려고 했다.

또한 스프링부트 3.0 이상을 쓰면서 QueryDSL을 써본적이 없었기에 겸사겸사 build.gradle.kts로 세팅하고 있었다.

의존성 추가 코드는 아래와 같다.

// build.gradle.kts
...
dependencies {
    // QueryDSL
    implementation("com.querydsl:querydsl-jpa")
    implementation ("com.querydsl:querydsl-core")
    implementation ("com.querydsl:querydsl-collections")
    annotationProcessor ("com.querydsl:querydsl-apt:5.0.0")
...
}

QueryDslConfig

또한 아래처럼 JPAQueryFactory의 생성자 파라미터로에 엔티티 매니저를 넣어줘야하는데

생성자에 엔티티 매니저를 넣으려 하니 컴파일 에러가 발생했다.


문제 해결

결론부터 말하자면 의존성 추가 부분을 아래처럼 버전을 명시해주면 해결된다.

본인은 기존 의존성 추가 코드를 안지우고 아래에 코드만 추가해서 의미없는 시간을 너무 허비했다.

꼭 기존 QueryDSL의존성 추가 코드는 지우고 쓰자.

// build.gradle.kts
...
val queryDslVersion = "5.0.0" // QueryDSL Version Setting

dependencies {
    // QueryDSL
    implementation("com.querydsl:querydsl-jpa:${queryDslVersion}:jakarta")
    implementation ("com.querydsl:querydsl-core")
    implementation ("com.querydsl:querydsl-collections")
    annotationProcessor("com.querydsl:querydsl-apt:${queryDslVersion}:jakarta")
    annotationProcessor("jakarta.annotation:jakarta.annotation-api") // java.lang.NoClassDefFoundError (javax.annotation.Entity) 방지
    annotationProcessor("jakarta.persistence:jakarta.persistence-api") // java.lang.NoClassDefFoundError (javax.annotation.Entity) 방지
...
}

 

기존의 의존성을 추가 코드는 아래처럼 그림 JPAQueryFactory 구현체가 javax에서 엔티티 매니저를 탐색한다.

위처럼 세팅하고 나면 아래와 같이 엔티티 매니저를 jakarta에서 찾기 때문에 오류가 해결된다.

변경 전

변경 후

 

혹시 필요한 사람이 있을지 모르니 build.gradle.kts 전문은 아래와 같다.

// build.gradle.kts
plugins {
	java
	id("org.springframework.boot") version "3.2.4"
	id("io.spring.dependency-management") version "1.1.4"
}

group = "com.commerce"
version = "0.0.1-SNAPSHOT"
val queryDslVersion = "5.0.0" // QueryDSL Version Setting

java {
	sourceCompatibility = JavaVersion.VERSION_17
}

configurations {
	compileOnly {
		extendsFrom(configurations.annotationProcessor.get())
	}
}

repositories {
	mavenCentral()
	maven(url="https://jitpack.io")
}

dependencies {
	implementation("org.springframework.boot:spring-boot-starter-actuator")
	implementation("org.springframework.boot:spring-boot-starter-data-jpa")
	implementation("org.springframework.boot:spring-boot-starter-data-redis")
	implementation("org.springframework.boot:spring-boot-starter-web")
	implementation("org.springframework.boot:spring-boot-starter-validation")

	// 아임포트
	implementation("com.github.iamport:iamport-rest-client-java:0.2.23")

	// 웹소켓
	implementation("org.springframework.boot:spring-boot-starter-websocket")

	// JWT
	implementation("io.jsonwebtoken:jjwt-api:0.12.1")
	runtimeOnly("io.jsonwebtoken:jjwt-impl:0.12.1")
	runtimeOnly("io.jsonwebtoken:jjwt-jackson:0.12.1")
	implementation("org.springframework.security:spring-security-crypto")
	implementation("org.bouncycastle:bcprov-jdk15on:1.70")

	// QueryDSL
	implementation("com.querydsl:querydsl-jpa:${queryDslVersion}:jakarta")
	implementation ("com.querydsl:querydsl-core")
	implementation ("com.querydsl:querydsl-collections")
	annotationProcessor("com.querydsl:querydsl-apt:${queryDslVersion}:jakarta")
	annotationProcessor("jakarta.annotation:jakarta.annotation-api")
	annotationProcessor("jakarta.persistence:jakarta.persistence-api")

	annotationProcessor("org.projectlombok:lombok")
	compileOnly("org.projectlombok:lombok")
	runtimeOnly("com.h2database:h2")
	runtimeOnly("com.mysql:mysql-connector-j")
	testImplementation("org.springframework.boot:spring-boot-starter-test")
}

tasks.withType<Test> {
	useJUnitPlatform()
}

val querydslDir = layout.buildDirectory.dir("generated/querydsl").get().asFile

sourceSets.getByName("main") {
	java.srcDir(querydslDir)
}

tasks.withType<JavaCompile> {
	options.generatedSourceOutputDirectory.set(file(querydslDir))
}

// clean 이후에 querydsl 폴더를 지움
tasks.named("clean") {
	doLast {
		file(querydslDir).delete()
	}
}

+ Recent posts