JPA

[JPA] SpringBoot + Gradle + Querydsl

da77777 2022. 7. 24. 22:00
  • 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.

 

 

시도했으나 실패한 방법들

  1. ~/generated 폴더 삭제 추가
  2. 인텔리제이에서 File > Settings > Build, Execution, Deployment > Build Tools > Gradle > Build and run using: IntelliJ IDEA 로 변경
  3. File > Settings > Build, Execution, Deployment > Compiler > Annotation Processors > Enable annotation processing 활성화
  4. jdk 버전 설정하는 부분을 모두 확인 (확인 해봤으나 모두 동일)
  5. 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