본문 바로가기
공부/프로그래밍

[springboot 3.x, querydsl] QClass 생성 및 경로 설정

by demonic_ 2023. 3. 31.
반응형

springboot 2.x 와 달라진점이 있다면 plugins 에 편의상으로 추가했던 다음항목을 사용하지 못하면서 문제가 시작된다.

id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
 

위 플러그인을 사용하면 compileQuerdsl 이라는 Task 가 생기고 실행하면 QClass 를 정해진 위치에 생성한다. 그래서 querydsl 을 사용하는데 경로에러 등이 발생하지 않는다.

 

그런데 이 플러그인을 사용하지 못하면서 task에 직접 설정을 추가해야 한다.

 

우선 설정 완성형을 먼저 공개하고, 이후 왜 이렇게 설정이 되었는지 설명하고자 한다

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

group = 'com.wideuse'
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-security'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-validation'


    implementation 'io.jsonwebtoken:jjwt-api:0.11.5'
    implementation 'com.mysql:mysql-connector-j:8.0.32'
    implementation 'com.h2database:h2:2.1.214'
    implementation 'org.postgresql:postgresql:42.5.4'
    implementation 'org.modelmapper:modelmapper:3.1.1'


    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"



    implementation group: 'org.springdoc', name: 'springdoc-openapi-ui', version: '1.6.7'


    compileOnly 'org.projectlombok:lombok'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testImplementation 'org.springframework.security:spring-security-test'
}

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



def querydslSrcDir = 'src/main/generated'
clean {
    delete file(querydslSrcDir)
}
tasks.withType(JavaCompile) {
    options.generatedSourceOutputDirectory = file(querydslSrcDir)
}
 

위 코드에서 눈에 띄는건 clean 과 task.withTyp(JavaCompile) 이다.

한가지 확인된 건, 엔티티를 수정한다음 SpringApplication.run(스프링부트 실행)을 하면 자동으로 QClass가 생성된다는 점이다.

그러나 이 방법은 엔티티를 수정한 뒤에 쿼리를 수정해야 하는 입장에서 매번 서버를 켰다 껐다를 해야하기 때문에 권장하는 바는 아니다. 내 경우도 이런 이유 때문에 이전 버전에서 compileQuerdsl 기능을 자주 썼었다.

 

 

우선 생성된 클래스들의 위치를 지정한다. 내 경우는 'src/main/generated' 에다 해 두었다.

그리고 gradle에서 build > clean 을 실행하게 되면 QClass도 함께 지운다.

다음으로 other > javaCompile 을 실행하면 QClass 를 설정한 폴더에다가 이동하게 했다. 이 방법이 이전버전의 compileQuerydsl과 비슷한 역할을 하기 때문이다.

 

그럼 왜 이렇게 설정해야 했는지를 앞으로 이야기 해보고자 한다.

build > build를 실행할 경우 다음처럼 build/generated/sources/annotationProcessor 안에 QClass가 쌓여있다

 
그러나 위 세팅(tasks.withType(JavaCompile))을 하고나면 build 안에 annotationProcessor 가 생성되지 않는다. 대신 아래와 같이 src/main/generated 에 생성된 걸 확인할 수 있다.

 

그럼 이전 버전에 사용했던 compileQuerydsl을 사용하면 어떨까? 이전 프로젝트를 찾아 실행해보면 이전과 비슷하단걸 알 수 있었다. annotationProcessor 폴더는 있지만 QClass 들이 보이지 않는다

 

이전과 같은 세팅을 사용하지 못해서 QClass 경로가 애매한건데 다음세팅을 사용하지 못한게 그 이유다

querydsl {
    jpa = true
    querydslSourcesDir = querydslDir
    library = "com.querydsl:querydsl-apt"
}
 
 
root 경로에 querydsl 이라는 폴더가 생기고 자동으로 resource로 등록되는데, spring boot 3.x 부터는 위 설정을 하면 에러가 발생하기 때문에 설정하지 못하게 된 것이다.

 

때문에 2가지 선택지가 존재한다.

1) QClass 의 생성을 src/main/generated 폴더에 만들어 지도록 하던가

2) Intellij 에서 resource 폴더를 등록해 주는 방법이다.

 

첫번째 방법은 위에서 알아봤으니 2번째 방법에 대해 알아보자

아래는 Project Structure > Module 에서 추가한 모습이다.

우측의 +Add Content Root 를 클릭해 build/generated/sources/annotationProcessor 폴더를 등록한다.

 

설정을 하고나면 build 폴더 내에 sources root 가 등록된 것을 확인할 수 있다.

 

그러나 방금의 방법을 선택하지 않은 이유는 개발자의 intellij 에 직접 설정해야 한다. 이런 경우는 개발자의 설정에 따라간다는 불편함과 인수인계 혹은 코드를 새로 다운로드 받은 뒤에 설정해주는 매뉴얼을 읽기 않으면 QClass 가 경로에 잡히지 않아 어려움을 느낄 수 밖에 없다고 판단했기 때문이다.

 

때문에 clean > javaCompile 설정으로 하기로 했다.

 

다시 말하자면 위와같은 설정을 하지 않는다 하더라도 SpringApplication 을 Run 하고나면(웹서버의 경우 웹서버를 실행하고 나면) 자동으로 src/main/generated 폴더에 생성되기도 한다. 그러나 내 경우는 엔터티 수정이 일어나면 QClass 에 즉각 등록되길 원했기 때문에 별도의 설정을 build.gradle 에 추가한 것이다.

 

 

끝.

 

반응형

댓글