티스토리 뷰
멀티모듈 프로젝트 QueryDsl 세팅
아직 Gradle에 대한 이해가 부족해서 이것저것 수정해보고 해결한 방법을 공유해보겠다.
1. Entity를 포함한 모든 모듈에서 QClass가 생성되야 함에도 불구하고, QueryDsl dependencies를 추가한 모듈에서만 생기던 문제.
해결 방법
기본적으로 moule-core라는 공통 모듈을 모든 모듈에 추가해주고 있었다. 따라서 module-core에 dependencies를 추가해주면 모든 모듈프로젝트에 QClass가 생성될 것이라 예상했다.
그런데 QueryDsl 의존성 설정을 한 공통 모듈에만 generated 폴더가 생성되고, 다른 모듈에는 생성되지 않았다. 그래서 공통모듈에 설정해준 queryDsl 설정을 root 프로젝트의 build.gradle에 옮겼고 QClass가 각 모듈에 생성되었지만, compilequerydsl note: running jpa annotationprocessor 라는 오류를 마주하게 된다.
2. 멀티모듈 프로젝트 구성시 com.querydsl.core 라이브러리가 QClass에서 인식되지 않는 문제
멀티모듈 프로젝트의 기본 구성은 참고 자료를 활용했다.
plugins {
// (1) QueryDSL 플러그인 추가
id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
// lombok 어노테이션의 프로세스를 단순화
id "io.franzbecker.gradle-lombok" version "3.0.0"
id 'java'
}
// 현재의 root 프로젝트와 앞으로 추가될 서브 모듈에 대한 설정
allprojects {}
// 전체 서브 모듈에 해당되는 설정
subprojects {
apply plugin: 'java-library'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
apply plugin: 'com.ewerk.gradle.plugins.querydsl'
group = 'com.kurrant.multi'
version = '1.0'
sourceCompatibility = '17'
repositories {
mavenCentral()
}
dependencies {
compileOnly 'org.projectlombok:lombok:1.18.20'
annotationProcessor 'org.projectlombok:lombok:1.18.20'
// (2) QueryDSL 의존성 추가
compileOnly("com.querydsl:querydsl-core:${queryDslVersion}")
compileOnly("com.querydsl:querydsl-apt:${queryDslVersion}")
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
}
// (3) QClass 생성 위치
def querydslDir = "$buildDir/generated/querydsl"
querydsl {
jpa = true
querydslSourcesDir = querydslDir
}
// (4) QClass 소스 위치를 지정합니다.
sourceSets {
main.java.srcDir querydslDir
}
// (5) gradle 5.0 설정
configurations {
compileOnly {
extendsFrom annotationProcessor
}
querydsl.extendsFrom compileClasspath
}
compileQuerydsl {
options.annotationProcessorPath = configurations.querydsl
}
}
해결방법
변경사항 1. confuguration에 compileOnly extendsFrom annotaionProcessor 속성을 추가해주었다.
변경사항 2. compile "com.querydsl:querydsl-jpa:${queryDslVersion}" 삭제
변경사항 3. dependecies -> compile ("com.querydsl:querydsl-jpa:${queryDslVersion}") 부분을
compileOnly ("com.querydsl:querydsl-jpa:${queryDslVersion}") 로 변경해줌.
→ 3번의 변경사항으로 build/generated/querydsl 폴더에 있는 QClass의 querydsl 라이브러리를 읽어올 수 있게 되고, QClass는 오류 없이 정상적으로 생성이 되었지만, 갑자기 Controller와 Service 부분에서 error: cannot find symbol을 마주하게 되었다.
3. 멀티모듈 프로젝트 구성시 dependencies로 추가한 다른 모듈의 QClass가 읽어지지 않아 발생한 오류
각 모듈 안에 들어있는 Entity들의 QClass는 잘 생성되었지만, 여전히 app-group:compileQuerydsl FAILED 라는 문구가 발생했으며 원인은 domain-user에서 생성된 QClass를 app-group 모듈에서 읽어오지 못한 문제라고 생각했다. 하지만 어플리케이션을 실행하는 데에 있어 큰 문제가 없었기 때문에 일단 오류는 보류한 채로 프로젝트를 진행하기로 했다.
'Spring' 카테고리의 다른 글
[Spring] 멀티모듈 JPA 테스트 (0) | 2023.01.10 |
---|---|
컴파일 타임 의존성과 런타임 의존성 (0) | 2022.12.08 |
[Spring]생성자와 의존성 주입 (1) | 2022.12.07 |
[Spring]멀티모듈 프로젝트에서 MapStruct toEntity 메서드 null 오류 (0) | 2022.11.02 |
[Spring]Enum을 쉽게 관리하게 만드는 Converter (1) | 2022.11.01 |