본문 바로가기
Java/Spring

스프링 부트 3.0 이상에서 QueryDSL 설정

by yongckim 2022. 12. 3.
728x90
반응형

김영한님의 실전! QueryDSL 강의를 보던 도중 QueryDSL이 다음과 같이 QueryDSL 컴파일 시도시 예외를 발생하는 것을 볼 수 있었습니다.

java.lang.NoClassDefFoundError: javax/persistence/Entity

 

현재 스프링 부트 3.0을 사용하고 있었고 querydsl 의존성을 다음과 같이 변경하였습니다.

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

group = 'com.example'
version = '0.0.1-SNAPSHOT'
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'
    // Spring boot 3.0 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"


    compileOnly 'org.projectlombok:lombok'
    runtimeOnly 'com.h2database:h2'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

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

// Querydsl 설정부
def generated = 'src/main/generated'

// querydsl QClass 파일 생성 위치를 지정
tasks.withType(JavaCompile) {
    options.getGeneratedSourceOutputDirectory().set(file(generated))
}

// java source set 에 querydsl QClass 위치 추가
sourceSets {
    main.java.srcDirs += [ generated ]
}

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

원인

스프링 부트 3.0 부터는 javax 패키지가 jakarta로 변경되어 잘못된 의존성(javax 패키지로 불러옴)을 불러와서 예외가 발생하는 문제였습니다.

 

그래서 의존성을 다음과 같이 변경하였습니다.

// 이전 설정
implementation "com.querydsl:querydsl-jpa:${queryDslVersion}"
annotationProcessor "com.querydsl:querydsl-apt:${queryDslVersion}"
// 현재 설정
implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"

 

그리고 해당 의존성만 추가시 Q클래스 파일을 못불러오기 때문에 src/main에 QClass가 생성될 수 있도록 다음 설정을 추가했습니다.

// Querydsl 설정부
def generated = 'src/main/generated'

// querydsl QClass 파일 생성 위치를 지정
tasks.withType(JavaCompile) {
    options.getGeneratedSourceOutputDirectory().set(file(generated))
}

// java source set 에 querydsl QClass 위치 추가
sourceSets {
    main.java.srcDirs += [ generated ]
}

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

 

위의 설정을 완료하면 잘 빌드되는 것을 확인할 수 있습니다.

이제 src/main/generated에 QClass가 Git에 올라가지 않도록 .gitignore에 다음 구문을 추가해줍시다.

**/generated

 

참고자료

https://www.inflearn.com/chats/700670/querydsl-springboot-3-0의-gradle-설정을-공유합니다

https://www.inflearn.com/chats/669477/querydsl-springboot-2-7%EC%9D%98-gradle-%EC%84%A4%EC%A0%95%EC%9D%84-%EA%B3%B5%EC%9C%A0%ED%95%A9%EB%8B%88%EB%8B%A4

반응형