본문 바로가기
Programming/Spring

QueryDSL 설정

by peter paak 2020. 11. 28.
728x90

이번 시간에는 QueryDSL 설정에 대해 알아보겠습니다. QueryDSL 설정 글이 있는데 각 설정들이 어떤 역할을 하는지에 대한 설명은 보이지 않은 것 같아서 정리를 한번 해보았습니다. 먼저 전체 코드를 보여드리고 각 부분에 대해 설명해보도록 하겠습니다.

전체 코드

build.gradle

// 1. 플러그인 설치
buildscript {
  repositories {
    maven {
      url "https://plugins.gradle.org/m2/"  // 플러그인의 저장소
    }
  }
  dependencies {
    classpath "gradle.plugin.com.ewerk.gradle.plugins:querydsl-plugin:1.0.10"   // 플러그인 디펜던시
  }
}

apply plugin: "com.ewerk.gradle.plugins.querydsl"   // 외부 플러그인 적용

// 2. 의존성 추가
dependencies {
    compile("com.querydsl:querydsl-jpa")            // querydsl
    compile("com.querydsl:querydsl-apt")            // QClass 생성
}

// 3. QueryDSL 플러그인 설정
apply plugin: "com.ewerk.gradle.plugins.querydsl"   // Plugin 적용
def querydslDir = "$buildDir/generated/querydsl"    // QClass 생성 위치

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

// 4. QClass 소스 위치 지정
sourceSets {
    main.java.srcDir querydslDir
}

// 5. gradle 5.0 설정 
configurations {
    querydsl.extendsFrom compileClasspath
}
compileQuerydsl {
    options.annotationProcessorPath = configurations.querydsl
}

build.gradle의 설정을 살펴보도록 하겠습니다. 저는 프로젝트를 멀티 프로젝트 기반으로 작성하였기에 buildscript를 사용하였고, 아래 내용을 이해하였다면 spring boot starter 설정에서도 사용하실 수 있을 거라 생각합니다.

세부 설정

1. 플러그인 설치

buildscript {
  repositories {
    maven {
      url "https://plugins.gradle.org/m2/"  // 플러그인의 저장소
    }
  }
  dependencies {
    classpath "gradle.plugin.com.ewerk.gradle.plugins:querydsl-plugin:1.0.10"   // 플러그인 디펜던시
  }
}

apply plugin: "com.ewerk.gradle.plugins.querydsl"   // 외부 플러그인 적용

먼저 QueryDSL을 사용하기 위한 플러그인을 설치합니다. com.ewerk.gradle.plugins.querydsl을 사용합니다. gradle 공식문서에 친절하게 사용법을 알려주고 있습니다.

2. depnedency 추가

dependencies {
    compile("com.querydsl:querydsl-jpa")            // querydsl
    compile("com.querydsl:querydsl-apt")            // QClass 생성
}

3. QueryDSL 플러그인 설정

def querydslDir = "$buildDir/generated/querydsl"    // QClass 생성 위치

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

querydsl-plugin에 잘 설명이 되어있습니다. 여기에 다양한 옵션들이 사용될 수 있는데, 저희는 library,jpa,querydslSourcesDir만 사용해보겠습니다.

library

  • Querydsl annotation processor library에 대응하는 artifact
  • 현재 spring data 프로젝트가 지원하는 버전만 사용이 가능
  • 기본값은 com.querydsl:querydsl-apt
  • 그래서 명시해줄 필요는 없지만 해당 디펜던시를 사용하는 것을 보여드리기 위해 추가했습니다.

jpa

  • QClass를 자동으로 생성할지 설정
  • 기본값은 false
  • true일 경우, com.querydsl.apt.jpa.JPAAnnotationProcessor가 추가되면서 프로젝트에 사용됩니다.
  • JPAAnnotationProcessor는 meta model(QClass)을 생성합니다.
  • false일 경우 build 타임에 QClass들이 생성되지 않게됩니다.

querydslSourcesDir

  • 어디에 QClass를 생성할지 설정
  • 기본값은 src/querydsl/java

4. QClass 소스 위치 지정

sourceSets {
    main.java.srcDir querydslDir
}

Annotation Processor plugin 에 잘 설명이 되어있습니다.

sourceSet

  • QClass가 생성된 위치를 나타냅니다
  • 앞서 설정한 querydslSourcesDir와 위치가 같아야 합니다
  • 기본적으로는 자바 소스와 리소스 파일의 그룹을 나타냅니다
  • 예를들어 자바 plugin은 기본적으로 src/main/java와 src/test/java를 기본 소스 디렉토리로 인식합니다.
  • main.java.srcDirbuild/generated/querydsl이 되게 됩니다
  • 나중에 User라는 도메인을 생성하면 해당 위치에 QUser라는 QueryDSL용 도메인이 생성되고 사용할 예정입니다.
  • 아래처럼 querydsl 폴더에 파란색 점이 생기면서 source root라고 생성됩니다.

5. gradle 5.0 설정

configurations {
    querydsl.extendsFrom compileClasspath
}
compileQuerydsl {
    options.annotationProcessorPath = configurations.querydsl   // querydsl-apt의 annotationProcessor 경로 지정
}

만약 gradle 5+ 버전을 사용하신다면 위의 설정을 추가하셔야 합니다. (gradle -v 명령어로 확인가능)
configurations

  • querydsl의 컴파일된 classpath 경로 지정

compileQuerydsl

  • querydsl-apt의 annotation processor 경로를 지정
  • gradle 5 버전에서는 자체 annotation processor 사용
  • querydsl-apt의 annotation processor와 충돌

위의 gradle.plugin.com.ewerk.gradle.plugins:querydsl-plugin:1.0.101.0.10에서 더 이상 지원이 되지 않습니다. (README를 보면 gradle5+ 버전으로 업그레이드 됨에 따라 업그레이드 계획을 가지고 있다고 하면서 링크를 걸어놓았는데 404 페이지로 나오는 것을 보니 더 이상의 계획은 없어 보입니다). gradle 4.6에서 Annotation Processor가 소개되었고, gradle 5+에서 반영되었기 때문에 해당 플러그인이 제대로 동작하지 않는 문제를 가지고 있습니다. 그래서 해당 플러그인을 사용하는 방법보다는 gradle의 annotationProcessor을 사용하는 방법을 권장합니다.자세한 내용은 honeymon님의 블로그에 나와 있으니 참고 하시기 바랍니다. 저는 회사와 비슷한 환경에서 작업을 하고 있고 최신버전으로 업그레이드할 계획이 없어서 아직까지 위의 방법을 사용하고 있습니다.

728x90