본문 바로가기
Spring

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

by 코리늬 2020. 9. 6.

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

댓글9

  • 헤헤 2020.10.19 15:20

    configure("querydsl-sample") { .... } 에서

    querydsl-sample 은 무엇을 의미하나요?


    지금
    JDK 11 / SpringBoot 2.3.4 / Gradle 6.6.1 에서
    QueryDSL 설정하려고

    build.gradle

    알려주신 것 처럼 Gradle annotation processor 설정 방법으로

    build.gradle 작성해 적용해보니

    적용해보니 compileQuerydsl 가 생성되질 않아서요.


    답글

    • 코리늬 2020.10.19 17:28 신고

      querydsl-sample 이라는 configure을 선언한다는 의미입니다.

      아무거나 넣으셔도 돼요.

    • 코리늬 2020.10.19 17:59 신고

      좀 더 정확한 사용방법을 알고싶으시면
      https://docs.gradle.org/current/dsl/org.gradle.api.Project.html#org.gradle.api.Project:configure(java.lang.Object,%20groovy.lang.Closure)

      여기 한 번 참고해보세요.

    • 코리늬 2020.10.22 23:48 신고

      설정파일 내용만 보고 큐 클래스가 생성되지 않는 원인을 파악하기엔 어려움이 있어보입니다.

      저도 일주일정도 삽질했던 기억이있네요 .
      그 당시에도 큐 클래스가 생성되지 않았던 원인이 굉장히 많았었습니다.

  • 2020.10.19 18:35

    비밀댓글입니다
    답글

    • 헤헤 2020.10.19 18:36

      서쿤스님

      익명으로 비밀글을 작성하다보니,

      저도 확인할 수가 없게 되었네요 .


      기존 공개 댓글에 답글로 남겨주시면 감사드리겠습니다.

    • 2020.10.22 23:46

      비밀댓글입니다

  • 코린이 2021.04.15 03:01

    와 진심 감사합니다 ㅠㅠ 덕분에 Q클래스 생성 안되는 문제 해결 했어요
    답글