QueryDsl Spring boot 3 이상 설정

Jake·2024년 4월 24일
1

queryDsl은 사용하기가 정말 편하지만 Configuration이 좀 중구난방이라 .. 무엇을 사용하는게 좋을지 매번 헷갈려서 정리를 해보려고 합니다.

plugin 정보

plugins {
    id 'java'
    id 'org.springframework.boot' version '3.1.5'
    id 'io.spring.dependency-management' version '1.1.4'
}

Gradle 5.0 이상 혹은 IntelliJ 2020.x를 사용하는 경우, Gradle로 프로젝트를 빌드할 때 “동일한 Q파일을 생성하지 말라”는 에러 메시지가 나타나며, 배포 작업에서 문제가 발생합니다.

이 배포 관련된 문제로 com.ewerk.gradle.plugins.querydsl 플러그인을 사용하지 않아요!


dependencies


// ⭐ Spring boot 3.x이상에서 QueryDsl 패키지를 정의하는 방법
    implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
    annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta"
    annotationProcessor "jakarta.annotation:jakarta.annotation-api"
    annotationProcessor "jakarta.persistence:jakarta.persistence-api"

QueryDsl 빌드 옵션


// === ⭐ QueryDsl 빌드 옵션 (선택) ===
def querydslDir = layout.buildDirectory.dir("generated/querydsl").get().asFile
sourceSets {
    main.java.srcDirs += [ querydslDir ]
}

tasks.withType(JavaCompile).configureEach {
    options.getGeneratedSourceOutputDirectory().set(file(querydslDir))
}

clean.doLast {
    file(querydslDir).deleteDir()
}


clean {
    delete file('src/main/generated')
}

위에서는 2가지에 대해 deprecated된 부분에 대해 수정해주었습니다.

def generated = "$buildDir/generated/querydsl" 와 같이 작성하면 deprecated 되었다는 내용을 볼 수 있는데요 이 부분을
def generated = layout.buildDirectory.dir("generated/querydsl").get().asFile 와 같이 변경하였습니다.


그리고

tasks.withType(JavaCompile) {
    options.annotationProcessorGeneratedSourcesDirectory = file(querydslDir)
}

이 부분에 대해

tasks.withType(JavaCompile).configureEach {
    options.getGeneratedSourceOutputDirectory().set(file(querydslDir))
}

로 수정하였습니다.


전체 코드


plugins {
    id 'java'
    id 'org.springframework.boot' version '3.1.5'
    id 'io.spring.dependency-management' version '1.1.4'
}

group = 'com.seoultech'
version = '0.0.1-SNAPSHOT'

java {
    sourceCompatibility = '17'
}

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-web'

    // redis
    implementation 'org.springframework.boot:spring-boot-starter-data-redis'

    //security
//    implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
    implementation 'org.springframework.boot:spring-boot-starter-security'

    // 좌표 저장
//    implementation 'org.hibernate', name: 'hibernate-spatial'

    annotationProcessor "org.springframework.boot:spring-boot-configuration-processor"

    //lombok
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'

    // jwt
    runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.2'
    runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.2'
    implementation 'io.jsonwebtoken:jjwt-api:0.11.2'

    // jackson
    implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310'
    implementation 'com.fasterxml.jackson.core:jackson-databind'

    // database
    runtimeOnly 'com.mysql:mysql-connector-j'

    // swagger
//    implementation 'org.springdoc:springdoc-openapi-ui:2.0.4'
    implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.4'

    // gson
    implementation 'com.google.code.gson:gson:2.9.0'

    // ⭐ Spring boot 3.x이상에서 QueryDsl 패키지를 정의하는 방법
    implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
    annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta"
    annotationProcessor "jakarta.annotation:jakarta.annotation-api"
    annotationProcessor "jakarta.persistence:jakarta.persistence-api"

    // test
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    testImplementation 'org.assertj:assertj-core:3.24.2'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testImplementation 'org.springframework.security:spring-security-test'
}

tasks.named('test') {
    useJUnitPlatform()
}

// === ⭐ QueryDsl 빌드 옵션 (선택) ===
def querydslDir = layout.buildDirectory.dir("generated/querydsl").get().asFile
sourceSets {
    main.java.srcDirs += [ querydslDir ]
}

tasks.withType(JavaCompile).configureEach {
    options.getGeneratedSourceOutputDirectory().set(file(querydslDir))
}

clean.doLast {
    file(querydslDir).deleteDir()
}


clean {
    delete file('src/main/generated')
}

0개의 댓글

관련 채용 정보