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가 쌓여있다
그럼 이전 버전에 사용했던 compileQuerydsl을 사용하면 어떨까? 이전 프로젝트를 찾아 실행해보면 이전과 비슷하단걸 알 수 있었다. annotationProcessor 폴더는 있지만 QClass 들이 보이지 않는다
이전과 같은 세팅을 사용하지 못해서 QClass 경로가 애매한건데 다음세팅을 사용하지 못한게 그 이유다
querydsl {
jpa = true
querydslSourcesDir = querydslDir
library = "com.querydsl:querydsl-apt"
}
때문에 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 에 추가한 것이다.
끝.
'공부 > 프로그래밍' 카테고리의 다른 글
Flutter 앱 개발 시리즈: SQLite 데이터베이스 다루기 + 버전관리 (1) | 2024.11.28 |
---|---|
Flutter 앱 개발 시리즈: Riverpod과 비동기 데이터 초기화 문제 해결하기 (0) | 2024.11.27 |
springboot Test 중에 403, 401 에러가 날때(spring security) (2) | 2023.03.22 |
[Linux] 젠킨스(jenkins) 포트번호 변경 (0) | 2023.03.20 |
[mac] ppk 키를 pem 키로 변환하기(ec2 접속) (0) | 2023.03.16 |
댓글