[JPA] SpringBoot + Gradle + Querydsl
- intelliJ 2021.X
- Spring Boot 2.4.5
- gradle 6.6.1
build.gradle
plugins {
id 'org.springframework.boot' version '2.4.5'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
}
group = 'com.blabla'
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'
runtimeOnly 'mysql:mysql-connector-java'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
tasks.named('test') {
useJUnitPlatform()
}
configure("querydsl-sample") {
apply plugin: "io.spring.dependency-management"
dependencies {
compile("com.querydsl:querydsl-core")
compile("com.querydsl:querydsl-jpa")
annotationProcessor("com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jpa") // querydsl JPAAnnotationProcessor 사용 지정
annotationProcessor("jakarta.persistence:jakarta.persistence-api") // java.lang.NoClassDefFoundError(javax.annotation.Entity) 발생 대응
annotationProcessor("jakarta.annotation:jakarta.annotation-api") // java.lang.NoClassDefFoundError (javax.annotation.Generated) 발생 대응
}
// generated 아래 Q클래스 파일 삭제
clean {
delete file('src/main/generated') // 인텔리제이 큐 클래스 경로
}
}
build/generated/sources/annotationProcessor/java/main 으로 쭉쭉 들어가면 QClass가 생성되어 있는 것을 볼 수 있다.
JPAQueryFactory을 Bean으로 등록
package com.blabla.coding;
import com.querydsl.jpa.impl.JPAQueryFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
@Configuration
public class QuerydslConfig {
@PersistenceContext
EntityManager em;
@Bean
JPAQueryFactory jpaQueryFactory() {
return new JPAQueryFactory(em);
}
}
완.
삽질
초반에 build.gradle을 아래와 같이 설정했었다. (플러그인 사용)
plugins {
id 'org.springframework.boot' version '2.4.5'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" //플러그인 추가
}
group = 'com.blabla'
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'
runtimeOnly 'mysql:mysql-connector-java'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
implementation 'com.querydsl:querydsl-jpa'
annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jpa"
}
tasks.named('test') {
useJUnitPlatform()
}
//querydsl에서 사용할 경로 선언
def querydslDir = "$buildDir/generated/querydsl"
//querydsl설정 : JPA 사용 여부, 사용할 경로 지정
querydsl {
jpa = true
querydslSourcesDir = querydslDir
}
//빌드 시 사용할 sourceSet 추가
sourceSets {
main.java.srcDir querydslDir
}
//querydsl이 compileClassPath를 상속하도록 설정
configurations {
querydsl.extendsFrom compileClasspath
}
//querydsl 컴파일 시 사용할 옵션 설정
compileQuerydsl {
options.annotationProcessorPath = configurations.querydsl
}
컴파일하는데 이런 에러메세지가 뜬다.
Attempt to recreate a file for type com.blabla.coding.domain.QAssessment
* What went wrong:
Execution failed for task ':compileJava'.
//에러 메세지 아니고 경고 메세지
Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
Use '--warning-mode all' to show the individual deprecation warnings.
시도했으나 실패한 방법들
- ~/generated 폴더 삭제 추가
- 인텔리제이에서 File > Settings > Build, Execution, Deployment > Build Tools > Gradle > Build and run using: IntelliJ IDEA 로 변경
- File > Settings > Build, Execution, Deployment > Compiler > Annotation Processors > Enable annotation processing 활성화
- jdk 버전 설정하는 부분을 모두 확인 (확인 해봤으나 모두 동일)
- File > Settings > Build, Execution, Deployment > Compiler > Java Compiler > Java Options > Additional command line parameters에 --warning-mode=all --stacktrace 추가 (애초에 경고 메세지였으나 뭐라도 해보자 싶어서 해봄)
해결
와 이럴수가 있나 싶어서 절망하다가 머리 좀 식히고
Attempt to recreate a file for type com.
로 다시 검색을 해봤다.
그리고 빛을 찾았다.
http://honeymon.io/tech/2020/07/09/gradle-annotation-processor-with-querydsl.html
[gradle] 그레이들 Annotation processor 와 Querydsl - I'm honeymon(JiHeon Kim).
이 글에서 다룰 예정인 ‘Querydsl’과 ‘Annotation processor’ 에 관한 내용도, 스프링 부트를 버전업하는 과정에서 겪게 된다. 사내 개발기기 교체주기가 되어 새로운 맥북을 받고 스프링 부트 버전
honeymon.io
플러그인을 사용하는 것 보다는 Annotation processor 사용하는 것을 권장하더라.
그리고 Settings > ... > Build and run using의 옵션 중 Gradle과 IntelliJ IDEA가 있는데, 전자는 QClass에 대해 별도의 처리를 하지 않아도 clean 으로 정리할 수 있으나, 후자는 Gradle > Tasks > applicaton > bootRun을 실행해야 한다고 한다. 나는 전자로 설정해두었다.
참고
https://gaemi606.tistory.com/entry/Spring-Boot-Querydsl-%EC%B6%94%EA%B0%80-Gradle-7x
Spring Boot | Querydsl 추가 (Gradle 7.x)
📌참고!!!! [gradle] 그레이들 Annotation processor 와 Querydsl Querydsl은 JPQL 빌더 오픈소스 프레임워크다. 일단 Querydsl 을 사용하기 위해 라이브러리를 추가해야 한다. SpringDataJPA도 추가되어 있어야..
gaemi606.tistory.com
https://jaime-note.tistory.com/67
[Querydsl] 프로젝트 설정 및 테스트
모든 소스 코드는 여기 있습니다. Querydsl 을 사용하기 위해 프로젝트 설정부터 차근차근 달려봅시다! 먼저 자바 버전은 11 , 스프링 버전은 2.5.2 를 선택하였고 gradle 프로젝트로 생성하여 아래 네
jaime-note.tistory.com
https://zzerosouth.tistory.com/40 → error: package com.querydsl.core.types does not exist
[Query DSL] package com.querydsl.core.types does not exist
Q-Type Error : package com.querydsl.core.types does not exist 얼마전에 발생한 Q-Type 에러가 또 다시 발생했다.. @Builder를 사용하면서 해결했었는데,이번에는 Lombok 어노테이션을 인식하지 못하는 문제가..
zzerosouth.tistory.com
https://javachoi.tistory.com/397 → Build and run using 설정 차이
간단한 QueryDSL 초기 설정 in Gradle 6
buildscript { ext { queryDslVersion = "4.4.0" } } plugins { id 'org.springframework.boot' version '2.4.3' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'java' } group = 'springboo..
javachoi.tistory.com