Spring

[Spring] SpringBoot + Gradle(5.x && 6.x) + Querydsl Setting

코리늬 2020. 9. 6. 17:41

SpringBoot + queryDsl Setting 총정리


스프링 버전 : 2.2.6

그래들 버전 : 6.4.1

 

QueryDsl 의존성을 추가해주고 프로젝트를 빌드했지만, 아래와 같은 에러가 빈번했다.

  1. 큐 클래스가 생성이 안됨 cannot find symbol q class

   2.큐 클래스가 생성은 됐지만, 중복됨 duplicate class

장장 5일정도는 셋팅만하느라 시간을 허비한 것 같다.


처음 queryDsl 설정은 이동욱님의 블로그를 보고 참고해서 작성했었다.

첫 셋팅은 대략 아래와 같았다. 구글링을해봐도 거기서 거기인듯하다.

buildscript {
    ext{
        springBootVersion = '2.2.4.RELEASE'
        querydslPluginVersion = '1.0.10'
    }
    repositories {
        mavenCentral()
        maven { url "https://plugins.gradle.org/m2/"}
    }
    dependencies {
        classpath("gradle.plugin.com.ewerk.gradle.plugins:querydsl-plugin:${querydslPluginVersion}")
    }
}

dependencies{
    ...
    compile group: 'com.querydsl', name: 'querydsl-jpa' // Query DSL 추가
    compile group: 'com.querydsl', name: 'querydsl-apt' // Query DSL 추가
    ...
}

//querydsl 적용
apply plugin: "com.ewerk.gradle.plugins.querydsl" //plugin 적용
def querydslSrcDir = 'src/main/generated' //Qclass 생성 위치

querydsl {
    library = "com.querydsl:querydsl-apt"
    jpa = true
    querydslSourcesDir = querydslSrcDir
}

sourceSets {
    main {
        java {
            srcDirs = ['src/main/java', querydslSrcDir]
        }
    }
}

하지만, 빌드시 큐 클래스를 찾을 수 없다는 에러가 나왔었다.

구글링을 통해 sourceSets 아래 코드를 추가해줬다. 그래들 5.xx이상 버전이라면 추가 설정이 필요하다고한다.

compileQuerydsl{
    options.annotationProcessorPath = configurations.querydsl
}

configurations {
    querydsl.extendsFrom compileClasspath
}

하지만 계속해서 큐 클래스가 중복이된다고 에러를 내뱉었다....

Querydsl은 프로젝트 내의 @Entity 어노테이션을 선언한 클래스를 탐색하고 JPAAnnotiationProcessor를 사용해 큐클래스를 생성한다.

그래들 4.6까지는 AnnotationProcessor를 정의하는 방법에대해 구체적을 정의가 되어있지않기 때문에 작성하기 어려웠다고한다.

구글링 영끌의 결과로 변경된 Gradle annotation processor 설정 방법을 찾아 시도해봤더니 마침내 동작했다..!

최종 Gradle

plugins {
    id 'org.springframework.boot' version '2.2.4.RELEASE'
    id 'io.spring.dependency-management' version '1.0.9.RELEASE'
    id 'java'
    id "com.github.node-gradle.node" version "2.2.3"
}

group = 'com.jpa'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}
repositories {
    mavenCentral()
}
dependencies {
    ...
    implementation group: 'com.querydsl', name: 'querydsl-jpa' // Query DSL 추가
    implementation group: 'com.querydsl', name: 'querydsl-apt' // Query DSL 추가
    ...
}


//querydsl 적용
//apply plugin: "com.ewerk.gradle.plugins.querydsl" //plugin 적용
//def querydslSrcDir = 'src/main/generated' //Qclass 생성 위치
//cannot find symbol은 해결됏으나 duplicate 발생
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) 발생 대응
    }

    
    // Gradle clean을 하게되면 생성된 generated 아래 Q클래스 파일이 삭제된다
    clean {
        delete file('src/main/generated') // 인텔리제이 큐 클래스 경로
    }
}

참고

http://honeymon.io/tech/2020/07/09/gradle-annotation-processor-with-querydsl.html?fbclid=IwAR00c7cJ0RIw7VqUU-JKpC2jgZ65eu2cB38mpoOXUnWVvA4BMP7RUkWvQo8