JPA/Spring Data JPA

[QueryDsl] Spring boot 3.0 이상 gradle 설정

KAispread 2023. 3. 29. 13:06
728x90
반응형

개요

QueryDSL은 정말 좋은 라이브러리이지만 설정이 조금 까다롭다는 단점이 있다. 특히 Spring Boot 버전이 3.xx 대로 올라오면서 기존 설정들이 제대로 동작하지 않는 문제가 발생하였다. 이러한 문제들을 해결한 QueryDsl 설정들을 기록 및 공유하려고 한다.

 

환경

Spring Boot : 3.0.3
Spring Data Jpa : 3.0.2
JDK : 17
IDE : Intellij - 3.3

 

🌊 build.gradle 

plugins {
	id 'java'
	id 'org.springframework.boot' version '3.0.3'
	id 'io.spring.dependency-management' version '1.1.0'
	//querydsl 추가
	id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
}

group = 'com'
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-security'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	implementation 'org.springframework.boot:spring-boot-starter-validation'

	// 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 ---

	compileOnly 'org.projectlombok:lombok'
	runtimeOnly 'com.h2database:h2'
	annotationProcessor 'org.projectlombok:lombok'
    
	testImplementation 'org.projectlombok:lombok:1.18.22'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	testImplementation 'org.springframework.restdocs:spring-restdocs-mockmvc'
	testImplementation 'org.springframework.security:spring-security-test'

	asciidoctorExt 'org.springframework.restdocs:spring-restdocs-asciidoctor'
	implementation 'com.auth0:java-jwt:4.3.0'

}

tasks.named('test') {
	useJUnitPlatform()
}

// Querydsl 설정부
def generated = 'src/main/generated'

querydsl {
	jpa = true
	querydslSourcesDir = generated
}
sourceSets {
	main.java.srcDir generated
}

compileQuerydsl{
	options.annotationProcessorPath = configurations.querydsl
}

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
	querydsl.extendsFrom compileClasspath
}

 

🌊 compileQuerydsl에 clean 동작 추가

gradle의 complieQuerydsl task를 통해 QType을 생성하는데, 기존 QType이 존재하면 에러가 발생했다.

따라서, clean 이후 complieQuerydsl 을 실행시켜주어야 했는데 매번 두 번 클릭하기 귀찮았기 때문에 clean 동작을 추가해주었다.

// complieQuerydsl Task에 clean 동작 추가
tasks.compileQuerydsl.dependsOn(clean);

compileQuerydsl{
	options.annotationProcessorPath = configurations.querydsl
}

 

 

🌊 Build 시 QType으로 인해 문제가 생길 경우

QueryDsl을 도입하고 나서 몇몇 gradle task를 실행할 때 간헐적으로 에러가 발생하는 상황이 빈번하게 발생했다. 예를 들어, 어느 날은 빌드가 되다가 어느날은 빌드가 안된다거나 하는..

그래서 원인을 찾아보니, Spring Boot 3.xx 대로 넘어오면서 querydsl 플러그인을 사용하면 여러 문제점이 생길 수 있다는 것을 알게되었다. 분명 처음 plugin을 추가했을 땐 build가 잘 됐는데 지금은 또 안된다.  

plugins {
    // querydsl plugin 제거
	// id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
}

// Querydsl 설정부
def generatedDir = 'src/main/generated'

clean {
	delete file (generatedDir)
}

//querydsl {
//	jpa = true
//	querydslSourcesDir = generated
//}
//sourceSets {
//	main.java.srcDir generated
//}
//compileQuerydsl{
//	options.annotationProcessorPath = configurations.querydsl
//}
//configurations {
//	compileOnly {
//		extendsFrom annotationProcessor
//	}
//	querydsl.extendsFrom compileClasspath
//}

위 QueryDsl 관련 설정 코드에서 변화가 있는 부분만 추출했다.

dependency는 유지하고 Querydsl 관련 플러그인 제거 및 clean 동작에 QType 제거 동작을 추가해주면 gradle task - build시 새 QType이 생성된다.

728x90
반응형