We will find a way, we always have.

-interstellar

Programming Language/자바

[Spring] query dsl Q클래스 파일 위치 설정 (스프링 버전 3.2 )

Redddy 2024. 2. 13. 00:58

 

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화강의를 듣는 도중 마지막 부분에서 query dsl 도입을 하기 위해 build.gradle 파일을 설정하는데, 스프링이 버전업 되면서 기존 코드로는 설정이 되지 않아 문제가 발생하였다.

 

제공해주신 3.x 버전용 build.gradle 파일에서도 그래들 리프레쉬중 오류가 나거나 빌드 오류가 발생하거나 겨우 컴파일 성공하여도 Q 클래스가 main.java.generate 에 위치해있는 게 아니라 어디 저 멀리 build.generated 에 가있어 자바 프로젝트 내에서 import 가 되지 않는 문제들이 있었다. 

 

컴파일 실패

 

 

어디 먼 나라가서 생성

 

 

 

먼나라 가버리면 import 가 안된다..

 

 

해결 방안은 일단 컴파일 성공하는 단계에서 Q 클래스 파일 생성 위치를 알맞게 설정하는 것이다.

 

 

 

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

group = 'jpabook'
version = '0.0.1-SNAPSHOT'

java {
	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-thymeleaf'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	implementation 'org.springframework.boot:spring-boot-devtools'
	implementation 'org.springframework.boot:spring-boot-starter-validation'
	implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.0'
	implementation 'com.fasterxml.jackson.datatype:jackson-datatype-hibernate5-jakarta'

	//Querydsl 추가
	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"


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

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

// Q클래스 파일 경로 설정
def generated = 'src/main/generated'

tasks.withType(JavaCompile) {
	options.getGeneratedSourceOutputDirectory().set(file(generated))
}

sourceSets {
	main.java.srcDirs += [ generated ]
}

// clean 시 generated 파일 제거
clean {
	delete file('src/main/generated')
}

 

 

 

야무지게 불려와진다