인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

송아름님의 프로필 이미지

작성한 질문수

실전! Querydsl

build.gradle 설정 문제 : querydsl,java21,lombok,mapstruct

작성

·

235

0

해당 스펙의 gradle설정 해보신분 이 계신다면 답변달아주시면 너무 감사하겠습니다ㅠㅠㅠ

 

가상스레드를 사용할예정이라 java 21,

querydsl,lombok을 포함하여 개발을 시작했습니다 (이후 mapstruct를 추가함)

 

처음설정은 어찌저찌 일일이 지정해가면서 빌드할때 compileQuerydls 태스크만 돌린다던지
querydsl관련 설정을 덕지덕지 붙여서 어떻게 생성시키고 돌아가게는 만들었던것 같습니다.

하지만 기존 설정이 mapstruct를 붙이게 되면서 문제가 생겼고 (anotationprocessor문제로 추정)

java21에서는 querydsl의 directory path 설정이라던지 기타 설정없이도 qclass가 생긴다하여

build.gradle 파일을 수정하며 삽질중인데 잘 해결되지 않아 질문글을 남기게 되었습니다.

 

제가 생각하기로는 lombok과querydsl,mapstruct의 anotationprocessor가 호환이 안되던지

분리해주어야 하거나 추가 설정이 필요해서 되지 않는 것인가 추측해보았습니다.

 

일단 기존 querydsl, lombok만 설정했던 소스와 현재 수정중인 소스를 첨부합니다

[기존파일] querydsl,lombok 설정

plugins {
    id 'java'
    id 'org.springframework.boot' version '3.3.5'
    id 'io.spring.dependency-management' version '1.1.6'
    id 'com.ewerk.gradle.plugins.querydsl' version '1.0.10'
}
apply plugin: 'com.ewerk.gradle.plugins.querydsl'

group = 'kr.co.aaa'
version = '0.0.1-SNAPSHOT'

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(21)
    }
}

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

dependencies {
	// Validation 관련 추가 의존성
    implementation 'jakarta.validation:jakarta.validation-api:3.0.2'
    implementation 'org.hibernate.validator:hibernate-validator:8.0.1.Final'

    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-quartz'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    compileOnly 'org.projectlombok:lombok'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    runtimeOnly 'org.postgresql:postgresql'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
    
    // QueryDSL 추가
    implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' // QueryDSL JPA 의존성
    implementation 'com.querydsl:querydsl-core'
    implementation 'com.querydsl:querydsl-collections'
    
    annotationProcessor 'com.querydsl:querydsl-apt:5.0.0:jakarta' // QueryDSL의 JPAAnnotationProcessor
    annotationProcessor 'jakarta.annotation:jakarta.annotation-api' // java.lang.NoClassDefFoundError (javax.annotation.Generated) 대응 코드
    annotationProcessor 'jakarta.persistence:jakarta.persistence-api' // java.lang.NoClassDefFoundError (javax.annotation.Entity) 대응 코드
 
 	//netty
 	implementation 'io.netty:netty-all:4.1.97.Final' // Netty 전체 라이브러리
}

// Querydsl 설정부
def generated = file('src/main/generated') // src/main/generated 경로 지정

querydsl {
    library = 'com.querydsl:querydsl-apt'
    jpa = true
    querydslSourcesDir = generated
}

sourceSets {
    main {
        java {
            srcDirs += "src/main/generated" // generated 폴더를 소스 경로에 추가
        }
    }
}

tasks.withType(JavaCompile).configureEach {
    options.annotationProcessorPath = configurations.annotationProcessor
    options.generatedSourceOutputDirectory.set(generated) // Q 클래스가 src/main/generated에 생성되도록 설정
}

// compileQuerydsl 태스크가 이미 존재하는지 확인하고, 없을 경우에만 등록
if (!tasks.names.contains("compileQuerydsl")) {
    tasks.register("compileQuerydsl", JavaCompile) {
        source = sourceSets.main.java.srcDirs
        classpath = sourceSets.main.compileClasspath // Main classpath 설정
        options.annotationProcessorPath = configurations.annotationProcessor
        destinationDirectory.set(generated) // 생성 경로 설정
    }
}

compileQuerydsl {
	options.annotationProcessorPath = configurations.querydsl
}

configurations {
	querydsl.extendsFrom compileClasspath
}

// gradle clean 시에 QClass 디렉토리 삭제
clean {
    delete file("src/main/generated")
}

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

 

[수정중인 파일] querydsl,lombok,mapstruct이 되도록 빌드하고자 했었음

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

group = 'kr.co.artlab'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '21'

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-quartz'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.0'
    implementation 'jakarta.validation:jakarta.validation-api:3.0.2'
    implementation 'org.hibernate.validator:hibernate-validator:8.0.1.Final'
    implementation 'org.mapstruct:mapstruct:1.5.5.Final'
    implementation 'io.netty:netty-all:4.1.97.Final'

    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    annotationProcessor 'com.querydsl:querydsl-apt:5.0.0:jakarta'
    annotationProcessor 'jakarta.annotation:jakarta.annotation-api'
    annotationProcessor 'jakarta.persistence:jakarta.persistence-api'
    annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.5.Final'

    runtimeOnly 'org.postgresql:postgresql'

    developmentOnly 'org.springframework.boot:spring-boot-devtools'

    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testRuntimeOnly 'org.junit.platform:junit-platform-launcher'

    // Querydsl
    implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
}

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

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

답변 2

0

David님의 프로필 이미지

안녕하세요. 송아름님, 공식 서포터즈 David입니다.

어떤 문제가 발생하였고 문제 관련 오류에 대한 정보도 함께 포함해 주시면 답변에 큰 도움이 됩니다.

또한 이런 문제를 해결하실 때 새로운 프로젝트를 만들어서 의존성을 하나씩 추가하여 어떤 부분에서 오류가 발생하는지 명확히 하는 것도 도움이 되니 참고해 주세요:)

감사합니다.

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다.

송아름님께서 QueryDSL, Lombok 및 MapStruct와 함께 Java 21 환경에서의 build.gradle 설정 문제를 접하셨군요. 특히, Annotaion Processor의 호환성 문제로 인한 오류가 발생하는 것으로 보입니다. 송아름님과 유사한 문제를 겪고 해결한 사례들이 있어, 아래에 관련한 해결책 게시물을 소개해 드리겠습니다.

  • Querydsl 설정관련 질문: 이 질문에서는 QueryDSL과 Lombok을 함께 사용할 때의 설정 문제를 다루고 있습니다. 질문자 cwj님과 여러 사용자들이 비슷한 문제에 대해 경험을 공유하고, 다양한 설정 방법과 코드를 제공하고 있습니다.

이 문서는 QueryDSL, Lombok, MapStruct와 같은 애노테이션 프로세서가 포함된 환경에서 발생할 수 있는 일반적인 설정 문제를 설명합니다. 몇 가지 주요 포인트를 간단히 요약하자면:

  1. AnnotationProcessor 설정: 각 프로세서가 제대로 동작하도록 하기 위해선 annotationProcessor 종속성을 올바르게 나열하고 구성해야 합니다. 이 경우, 순서를 신경 써야 할 수도 있습니다.

  2. Java 21의 추가 설정: Java 21의 새로운 기능이나 변경된 부분이 기존의 라이브러리와 충돌하지 않도록 하기 위해선 종속성의 버전을 확인하고, 필요한 경우 다른 라이브러리 버전으로의 업데이트가 필요할 수 있습니다.

  3. Gradle의 동작 원리 이해기: 특정 환경 설정이나 의존성이 추가될 때 Gradle의 빌드 순서와 타스크 실행을 확실히 이해하는 것이 중요합니다.

제안해드린 링크를 참고하시고, build.gradle 설정을 재확인해 보세요. 이와 같은 복잡한 설정은 각 라이브러리의 문서를 함께 보고, 최신 버전을 사용해보는 것도 좋은 방법입니다.

저는 질문자님의 이해를 돕고자 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.

현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏

추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.