[Spring] QueryDsl gradle 설정 (Spring boot 3.0 이상)

Kai·2022년 11월 30일
25

스프링

목록 보기
8/18

☕ 시작


스프링 부트의 버전이 3.0으로 올라가면서 QueryDsl의 설정방법이 달라져서 공유 + 메모할 겸 글을 쓴다.

querydsl단독으로 쓸 때는 아니고, spring data jpa와 같이 쓰는 경우이다.

💻 개발 환경

- OS: Ubuntu20.04 (wsl)
- IDE: IntelliJ
- Jdk: openjdk 17버전
- Gradle언어: Groovy

🧾 build.gradle


plugins {
	id 'java'
	id 'org.springframework.boot' version '3.0.0'
	id 'io.spring.dependency-management' version '1.1.0'
    // querydsl관련 명령어를 gradle탭에 생성해준다. (권장사항)
    id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" 

}

group = 'sample'
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'
	compileOnly 'org.projectlombok:lombok'
	runtimeOnly 'com.mysql:mysql-connector-j'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	
    // === QueryDsl 시작 ===
    
	// == 스프링 부트 3.0 이상 ==
	implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
	annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
    
    // == 스프링 부트 3.0 미만 ==
    implementation 'com.querydsl:querydsl-jpa'
	annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jpa"
    
	annotationProcessor "jakarta.annotation:jakarta.annotation-api"
	annotationProcessor "jakarta.persistence:jakarta.persistence-api"
    
    // === QueryDsl 끝 ===
}

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

// === Querydsl 빌드 옵션 (선택사항) ===
def querydslDir = "$buildDir/generated/querydsl"

querydsl {
	jpa = true
	querydslSourcesDir = querydslDir
}

sourceSets {
	main.java.srcDir querydslDir
}

configurations {
	querydsl.extendsFrom compileClasspath
}

compileQuerydsl {
	options.annotationProcessorPath = configurations.querydsl
}
  • dependencies에서 주석처리한 부분을 잘 설정하면 된다.
  • querydsl-jpa, querydsl-apt 라이브러리를 명시해주는 방법이 변경됐다.
  • jakarta.annotation-apijakarta.persistence-api는 아래와 같은 에러를 방지하기 위해서 추가해준다.
java.lang.NoClassDefFoundError:javax/persistence/Entity
  • 빌드 옵션은 입맛에 맞게 설정해주면 된다. 특히 querydslDir옵션은 Q클래스들을 빌드 폴더 안으로 빌드되게 할 수 있어서 유용하다 ㅎㅎ

⭐⭐ 중요! Querydsl 플러그인 관련 이슈


2023-03-06에 추가함

위에서 안내하고 있는 Gradle 설정은 Querydsl 플러그인을 사용하도록 되어 있는데, gradlew로 빌드할 때, 문제가 있어서 플러그인은 사용하면 안된다!!!
Spring을 로컬에서 실행, 빌드하는 건 되지만 배포를 위해 gradlew를 사용해서 빌드를 하면, 동일한 Q파일을 생성하지말라고 에러가 뜬다.
(이 문제를 해결을 하는데 한~~참 걸렸다. 😂)

검색을 해보면 거의 대부분, Querydsl플러그인을 사용해서 build.gradle을 작성하는 것을 많이들 알려주고 있는 것 같다... ㅠㅠ
다들 나처럼 고생을... 좀... 할 것 같다 😂

아무튼 위와 같이 build.gradle을 설정하면 안되고, 아래와 같이 설정해야한다. 꼭!꼭!꼭!

plugins {
	id 'java'
	id 'org.springframework.boot' version '3.0.3'
	id 'io.spring.dependency-management' version '1.1.0'
	//	id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" // ⭐ Querydsl 플러그인 사용 X
}

group = 'sample'
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'
	compileOnly 'org.projectlombok:lombok'
	runtimeOnly 'com.mysql:mysql-connector-j'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'

    // ⭐ 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"
}

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

// === ⭐ QueryDsl 빌드 옵션 (선택) ===
def querydslDir = "$buildDir/generated/querydsl"

sourceSets {
	main.java.srcDirs += [ querydslDir ]
}

tasks.withType(JavaCompile) {
	options.annotationProcessorGeneratedSourcesDirectory = file(querydslDir)
}

clean.doLast {
	file(querydslDir).deleteDir()
}

🙏 참고


23개의 댓글

comment-user-thumbnail
2022년 12월 18일

3.0으로 프로젝트 진행하면서 막혔는데 감사합니다!

1개의 답글
comment-user-thumbnail
2023년 5월 6일

감사합니다! ㅎㅎ

1개의 답글
comment-user-thumbnail
2023년 5월 9일

은인이십니다.. 감사합니다 !!!

1개의 답글
comment-user-thumbnail
2023년 8월 2일

감사합니다!

1개의 답글
comment-user-thumbnail
2023년 8월 21일

3.0 설정에서 엄청 애먹었는데 겨우 찾았네요 감사합니다 ㅠ

1개의 답글
comment-user-thumbnail
2023년 11월 18일

감사합니다 ㅠㅠ

1개의 답글
comment-user-thumbnail
2023년 11월 23일

최근 3.X 이상 버전의 스프링으로 Querydsl을 사용하다 막혔는데 ㅠㅠ 갑사합니다.

1개의 답글
comment-user-thumbnail
2023년 11월 29일

감사합니다!

1개의 답글
comment-user-thumbnail
2024년 1월 24일

안녕하세요 정보의 바다 속에서 한 줄기 등대빛과 같은 포스팅 정말 감사합니다!
몇 가지 질문이 있습니다(안되어서 여쭤봅니다 ㅠㅠ)
1. 혹시 gradle 버전이 어떻게 되시나요?
2. gradle > other > compileJava RUN 했을 때 q클래스들이 생겨야하는게 맞나요?

전 아래와 같은 환경에서 진행중입니다
부트 3.1.4
JDK 17
gradle 8.4

1개의 답글
comment-user-thumbnail
2024년 5월 8일

구글링 암만하고 GPT 암만 돌려봐도 안나오던건데 감사합니다 ㅠㅠ

1개의 답글