Software Engineering/[BE] Spring Boot (Java)

[Spring Boot] Query DSL 설정

devhrkim 2024. 6. 22. 21:55

목차

  • build.gradle 코드
  • 코드 설명

build.gradle (Groovy)

plugins {
    id 'java'
    id 'org.springframework.boot' version '3.2.2'
    id 'io.spring.dependency-management' version '1.1.4'
    id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
}

java {
	sourceCompatibility = "17"
}

repositories {
	mavenCentral()
}

dependencies {
    implementation (
        "org.springframework.boot:spring-boot-starter-data-jpa",
        "org.springframework.boot:spring-boot-starter-web",
        "org.projectlombok:lombok:1.18.28",
        "org.postgresql:postgresql:42.6.2",
        "com.querydsl:querydsl-jpa:5.0.0:jakarta",
        "org.geotools.jdbc:gt-jdbc-postgis:26.5",
        "org.hibernate.orm:hibernate-spatial:6.4.8.Final"
    )
    runtimeOnly (
        "org.postgresql:postgresql",
    )
    annotationProcessor (
        "org.projectlombok:lombok:1.18.28",
        "com.querydsl:querydsl-apt:5.0.0:jakarta",
        "jakarta.annotation:jakarta.annotation-api",
        "jakarta.persistence:jakarta.persistence-api"
    )
}
compileJava.dependsOn("clean")

compileQuerydsl {
    options.annotationProcessorPath = configurations.querydsl
}

tasks.withType(JavaCompile).configureEach {
    doFirst {
        def generatedDir = file("$buildDir/generated/")
        if (generatedDir.exists()) {
            generatedDir.deleteDir()
        }
    }
}

def querydslDir = "$buildDir/generated/querydsl"
querydsl {
    jpa = true
    querydslSourcesDir = querydslDir
}

sourceSets {
    main.java.srcDir querydslDir
}

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
    querydsl.extendsFrom compileClasspath
}

test {
    useJUnitPlatform()
}

bootJar {
    archiveFileName = 'geolabserver.jar'
}

 

query dsl은 빌드하고 나서 build 폴더 하위에 Q{엔티티명}의 파일이 생긴다.

(내 경우엔 build/generated/annotationProcessor/java/main/{패키지명/{엔티티경로}})

 

① 빌드를 실행하면 compileJava.dependsOn("clean") 이 코드에 따라 이전의 빌드 결과물을 제거하고

② compileQuerydsl {} QueryDSL 코드를 컴파일하는 데 필요한 설정을 하는 블록

options.annotationProcessorPath = configurations.querydsl

     QueryDSL을 사용하여 생성된 코드를 컴파일할 때 필요한 annotation processor의 경로를 설정

JavaCompile 타입의 모든 태스크의 설정을 변경한다. doFirst {} 그 작업을 수행하기 전에 generated 폴더가 존재한다면 삭제

 

def querydslDir = "$buildDir/generated/querydsl"
querydsl {
	jpa = true
	querydslSourcesDir = querydslDir
}

 

⑤ QueryDSL 플러그인의 설정

jpa = true JPA 엔터티에 대한 QueryDSL 클래스를 생성 (== Q{엔티티명} 클래스 생성 ==쿼리 타입 클래스 생성)

querydslSourcesDir = querydslDir 생성된 QueryDSL 클래스들을 저장할 디렉토리를 지정

 

sourceSets {
	main.java.srcDir querydslDir
}

 

⑥ 이 설정은 Gradle 빌드 시 sourceSets를 통해 main 소스 세트의 Java 소스 디렉토리를 추가로 지정해서 QueryDSL이 생성한 클래스들이 소스 세트에 포함되어 컴파일되도록 한다.

 

예를 들면 entity 경로가 java/main/{패키지명}/model 이라면

빌드 수행 후, build/generated/sources/annotationProcessor/java/main/{패키지명}/model/Q{엔티티명} 이렇게 소스 세트 지정해준다는 말이다.

 

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
	querydsl.extendsFrom compileClasspath
}

 

compileOnly 컴파일 시에만 필요한 작업

extendsFrom annotationProcessor annotationProcessor 구성에 있는 의존성 추가

compileClasspath는 빌드 폴더 하위에 있고 Gradle 빌드 시에 컴파일 및 실행에 필요한 모든 클래스와 리소스가 포함된 클래스 패스

querydsl.extendsFrom compileClasspath 이건 querydsl이 이것을 상속받겠다는 말이다.