jingyulog

QueryDSL gradle, maven 설정 (스프링 부트 3.X 이상) 본문

Tech/JPA

QueryDSL gradle, maven 설정 (스프링 부트 3.X 이상)

jingyulog 2023. 4. 20. 18:08

gradle 설정

queryDSL 은 버전별로 설정이 자주바뀐다.

이에 맞춰 필자는 구글링하여 최적의 해를 정리해보았다.

스프링 부트 2.X 버전에서와 3.X 버전에서의 build.gradle 설정 방법은 다르다.

  • 스프링 부트 2.X 버전 설정

<1>

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

group = 'study'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    
    //querydsl 추가
    implementation 'com.querydsl:querydsl-jpa'
    
    compileOnly 'org.projectlombok:lombok'
    runtimeOnly 'com.h2database:h2'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: ‘org.junit.vintage’, module: ‘junit-vintage-engine'
    }
}

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
}

//querydsl 추가 끝

<2>

plugins {
	id 'org.springframework.boot' version '2.7.4'
	id 'io.spring.dependency-management' version '1.0.14.RELEASE'
	id 'java'
}

group = 'study'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

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.h2database:h2'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'

	// queryDSL 설정
	implementation "com.querydsl:querydsl-jpa"
	implementation "com.querydsl:querydsl-core"
	implementation "com.querydsl:querydsl-collections"
	annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jpa" // querydsl JPAAnnotationProcessor 사용 지정
	annotationProcessor "jakarta.annotation:jakarta.annotation-api" // java.lang.NoClassDefFoundError (javax.annotation.Generated) 대응 코드
	annotationProcessor "jakarta.persistence:jakarta.persistence-api" // java.lang.NoClassDefFoundError (javax.annotation.Entity) 대응 코드
}

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.X 버전 이상에서의 설정
plugins {
	id 'java'
	id 'org.springframework.boot' version '3.0.3'
	id 'io.spring.dependency-management' version '1.1.0'
    //  Querydsl 플러그인 사용 X
	//	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'

    // 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.generatedSourceOutputDirectory = file(querydslDir)
}

clean.doLast {
	file(querydslDir).deleteDir()
}
  • jakarta.annotation-api와 jakarta.persistence-api는 아래와 같은 에러를 방지하기 위해서 추가해준다.
java.lang.NoClassDefFoundError:javax/persistence/Entity
  • querydslDir옵션은 Q클래스들을 빌드 폴더 안으로 빌드되게 할 수 있어서 유용하다.

maven 설정

<dependency>
    <groupId>com.querydsl</groupId>
    <artifactId>querydsl-apt</artifactId>
    <version>5.0.0</version>
    <classifier>jakarta</classifier>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>com.querydsl</groupId>
    <artifactId>querydsl-jpa</artifactId>
    <version>5.0.0</version>
    <classifier>jakarta</classifier>
</dependency>

<요약>

QueryDSL 은 apt-maven-plugin 을 사용하여 컴파일 과정에서 Q-Type 클래스를 생성한다.

따라서 querydsl-apt jakarta 버전에서는 apt-maven-plugin 이 필요 없다!

 

<원인>

querydsl-apt jakarta 버전에서는 javax.annotation.processing.Processor 를 서비스로 제공하고 있고, 자바 컴파일러가 이를 사용하여 Q-class 를 target/generated-sources/annotation 에 생성한다.

그러므로 apt-maven-plugin 이 이중 동작해서 에러가 발생한다.

 

<결과>

만약 pom.xml 에 apt-maven-plugin 설정이 있다면 에러가 발생할 수 있다.

이때 설정한 apt-maven-plugin 을 제거하면 된다.

 

인용

https://velog.io/@juhyeon1114/Spring-QueryDsl-gradle-%EC%84%A4%EC%A0%95-Spring-boot-3.0-%EC%9D%B4%EC%83%81

 

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

스프링 부트 3.0이상에서의 Querydsl 설정방법

velog.io

https://ittrue.tistory.com/293

 

[JPA] QueryDSL build.gradle 환경 설정

스프링 부트 프로젝트 생성 Spring initialzr에서 프로젝트를 생성한다. Spring Web, JPA, H2 Database 등 필요한 의존 라이브러리 설정이 필요하다. Spring Boot 2.6 ~ 2.7과 3.0은 build.gradle 설정 방법이 다르다. Que

ittrue.tistory.com

https://coding-log.tistory.com/244

 

[Spring boot] JPA QueryDSL 환경 설정, 연동하기 (Maven, Gradle ver)

JPA에서 동적쿼리를 사용하기 위해 QueryDSL을 사용해야 하는데 이걸 쓰려면 외부에서 라이브러리를 가져와야 하기 때문에 세팅이 필요하다. Maven version pom.xml //의존성 부분 com.querydsl querydsl-apt provi

coding-log.tistory.com

https://post.dooray.io/we-dooray/tech-insight-ko/back-end/4173/

 

스프링 부트 3.0 으로 전환 - Dooray! POST

2022년 11월에 기존의 Spring framework 5 와 Spring Boot 2.X 버전을 대체하는 Spring framework 6와 Spring Boot 3 가 릴리즈되었습니다. 어떤 변화가 있고, 어떻게 설정해야 할지 알아봅니다

post.dooray.io

 

'Tech > JPA' 카테고리의 다른 글

지연로딩 vs 즉시로딩  (0) 2023.04.27
QueryDsl 사용 및 도출되는 쿼리문 예제  (0) 2023.04.20
쿼리 메서드 Sample 및 JPQL snippet  (0) 2023.04.14
QueryDSL 라이브러리  (0) 2023.04.12
JPA Lock  (0) 2023.04.11