[Spring] gradle에서 querydsl을 셋팅 하는 방법

들어가며

예전에 query dsl 관련 셋팅을 올려두었다. 이전보다 더 좋은 설정 방법이 나와서 gradle에서 querydsl 관련 포스팅만 총 4번째 작성하고 있다… 이번이 마지막이 되기를!

대표적인 방법이 2가지인데, querydsl plugin을 이용하는 방법과 annotationProcessor을 이용해서 생성하는 방법이다.

이번에 작성하게 된 계기는, querydsl plugin을 이용하게 되면, querydsl로 생성된 QModel이 cache가 되지 않아 build시에 매번 생성이 되고 있는 것을 확인하고, 어떻게 하면 cache를 할 수 있을지 찾다가 발견하여 기록해 둔다.

어떻게 셋팅하나?

ext {
    set('queryDSL', '4.3.1')
}

dependencies {
    // QueryDSL
    implementation "com.querydsl:querydsl-jpa:${queryDSL}"
    annotationProcessor "com.querydsl:querydsl-apt:${queryDSL}:jpa"
    annotationProcessor 'org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.2.Final'
    annotationProcessor 'javax.annotation:javax.annotation-api:1.3.2'
    ...
}
  • gradle dependencies에 4개의 라이브러리만 추가하면 query dsl 셋팅이 끝난다.

뭐가 달라 지는거지?

build.gradle 설정 비교

plugins {
    ...
    id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
}

compileQuerydsl{
    options.annotationProcessorPath = configurations.querydsl
}

configurations {
    ...
    querydsl.extendsFrom compileClasspath
}

def querydslSrcDir = 'src/querydsl/generated'

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

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

project.afterEvaluate {
    project.tasks.compileQuerydsl.options.compilerArgs = [
            "-proc:only",
            "-processor", project.querydsl.processors() +
                    ',lombok.launch.AnnotationProcessorHider$AnnotationProcessor'
    ]
}

dependencies {
    implementation("com.querydsl:querydsl-jpa") // querydsl
    implementation("com.querydsl:querydsl-apt") // querydsl
    ...
}
  • querydsl plugin 방식과 비교를 해보면은 많은 설정 값이 추가되는 것을 확인할 수 있다.
  • lombok을 사용하고 있어서 더 많은 설정이 추가된 부분이 있지만, 대부분 lombok을 사용한다고 가정하면 앞에 방식과 비교하여 상당히 많은 설정이 추가가 발생한다.

compileQuerydsl 시점

  • querydsl plugin을 사용하게 되면, querydsl을 생성하는 방법은 gradle option에 있는 compileQuerydsl 사용하거나, build를 통해서 compile이 되어야 생성이 된다.
  • 해당 방식을 이용하게 되면, compileJava 시점에 querydsl QModel이 생성이된다
  • 즉, intellij에 Run, Debug를 통해서 서버를 실행할 때도 자동으로 최신 querydsl QModel을 생성하게 된다.

Cache 유무

  • gradle의 cache를 사용하기 위해서는 org.gradle.caching=true 설정을 해주어야 한다.
  • querydsl plugin을 이용해서도 cache가 가능한지는 모르겠지만, annotationProcessor 방식을 이용하면 Cache가 가능하다.
  • 그 이유는 compileJava 부분에 QModel을 생성하기에 변경이 발생하지 않는다면 gradle에서 증분 컴파일 옵션에 의해서 cache key를 사용할 수 있게 된다.

마치며

  • cache를 타기 위해서는 같은 부분에 변경이 없어야지만 cache를 이용하기에 무조건 좋아지는 것은 아니다.
  • 또한, build시에 gradle cache key를 매번 변경시키는 로직이 포함되어 있다면, cache를 이용하지 못 한다. (ex: download files, springboot-buildInfo etc)
  • querydsl plugin은 더 이상 개발이 되고 있는지 모르겠고.. gradle에서 deprecated된 compile을 사용하고 있어 추후 gradle version을 올릴때 제약사항이 될꺼 같아 변경하는 것이 좋아보인다.

build.gradle 관련 example code는 github에 올려두었으니 참고~!

Leave a comment