스프링/6. 스프링 DB-2

35. Querydsl 설정

sdafdq 2023. 10. 13. 07:47

build.gradle에

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"

이렇게 넣어 주고

 

plugins 부분에

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

이거 넣어주면 gradle 창에 querydsl 관련 명령어들을 추가 시킨다.

 

 

여튼 이게, 뭐 스프링 부트 버전이나 인텔리제이 버전이나 Querysql버전이나 여러가지로 그 때 따라 방법이 다르다고 한다.

인터넷 찾아보면 나온다고 함.

 

또,

이거 인텔리제이의 Gradle 옵션을 default인 gradle로 하냐 inteliJ로 하냐에 따라서 또 다르다고 함.

 

인텔리제이로 했을 땐 그냥 메인메소드 한번 돌리면 된다.(즉, 스프링 한번 띄워 주면 된다)

그럼 main 패키지 아래에 generated라는 패키지가 생기는 데 거기 하위 가다보면 나온다.

 

아니면 상단의 메뉴바 중 Build = Build Project 하면 생긴다

 

 

근데, 저거는 깃허브에 안올라가게끔 .gitignore에 generated 추가한다던지 그러는 게 좋음

또 지울때는 수동으로 지우거나, 

gradle 탭에서 build 들어가 보면 clean 되어 있을건데 그거 더블클릭하면 generated 폴더가 지워짐.

 

콘솔에서

./gradlew clean compileJava

하면 생김

 

설정을 할 수 있는데,

//def generated = 'src/main/generated'
def generated = layout.buildDirectory.dir("generated/querydsl").get().asFile

querydsl {
	jpa = true
	querydslSourcesDir = generated
}
sourceSets {
	main.java.srcDir generated
}

compileQuerydsl{
	options.annotationProcessorPath = configurations.querydsl
}

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
	querydsl.extendsFrom compileClasspath
}

저렇게 빌드됐을 시 위치,

저 주석과 아래의 차이는,

주석은 src파일, 우리가 개발하는 파일의 저 경로이고,

아래는 우리가 프로젝트 빌드했을 때의 폴더에 저 경로에 QueryDSL의 구현체를 넣는 것이다.

 

compileQuerydsl 명령을 실행했을 때 할 거 인 듯.

 

 

이게 generated 폴더 삭제

 

 

이게 사용할 QueryDSL 구현체 빌드

(참고로 빌드 할 때, 그 자체에 저 compileQuerydsl도 포함되어 있다. compileJava에 포함되어 있다고 할까? 그리고 그 compileJava가 build에 포함되어 있고. 그래서 WAS build 할 때 자동으로 빌드 되기에 git에 포함 안시킴)

 

 

 

 

 

plugins {
	id 'java'
	id 'org.springframework.boot' version '3.2.0'
	id 'io.spring.dependency-management' version '1.1.4'
    // QueryDSL 관련 명령어
	id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
}

group = 'study'
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-web'
	compileOnly 'org.projectlombok:lombok'
	runtimeOnly 'com.h2database:h2'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'

	//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"
}

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



// QueryDSL 설정들
//def generated = 'src/main/generated'
def generated = layout.buildDirectory.dir("generated/querydsl").get().asFile

querydsl {
	jpa = true
	querydslSourcesDir = generated
}
sourceSets {
	main.java.srcDir generated
}

compileQuerydsl{
	options.annotationProcessorPath = configurations.querydsl
}

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
	querydsl.extendsFrom compileClasspath
}

참고만 하셈. 업데이트 때 마다 다르니.

 

//def generated = 'src/main/generated'

def generated = layout.buildDirectory.dir("generated/querydsl").get().asFile

 

이 둘의 차이는 src 폴더 안에 구현체인 Q 파일들을 넣느냐, 아니면 빌드 폴더에 넣느냐인데,

 

만약 이 gradle을 쓰면서 영상처럼 compileQuerydsl 하고 시작하면

java: Attempt to recreate a file for type study.querydsl.entity.QTestEntity

 

이런 오류가 날 수 있음.

그러니까, Test를 시작할 때 빌드 하면서 시작하는데, 아마도 build에 compileJava가, compileJava에 compileQuerydsl이 포함되어 있음.

 

그래서 이미 compileQuerydsl로 QueryDSL 파일들을 빌드 한 상태에서 시작을 하려니,

저 파일을 다시 생성하려고 시도한다는 오류가 뜨는 걸로 추측됨.

 

근데 또 신기한게 뭔가 기록? 캐시가 남는지, QueryDSL 파일을 import 안한 상태로 뻘건줄 쭉쭉 있는 상태로 테스트 돌려서 자동으로 빌드가 따라오게끔 하면 저런 오류가 안뜸.

근데 이런 아무리 알고 있는 에러이지만 저런 환경에서 코드를 짠다는 건 좀..

저는 그래서 그냥

일단

def generated = 'src/main/generated'

여기에 Q파일을 일단 뒀다가, gitignore에 저거 등록 하고,

build 할 때만

def generated = layout.buildDirectory.dir("generated/querydsl").get().asFile

이걸로 바꿔놓는 걸 추천..

 

'스프링 > 6. 스프링 DB-2' 카테고리의 다른 글

37. 트레이드 오프, SpringDataJPA 사용에 따른 구조변화  (0) 2023.10.13
36. Querydsl 적용  (0) 2023.10.13
34. Querydsl 등장  (0) 2023.10.13
33. Querydsl  (0) 2023.10.13
32. 스프링데이터JPA 적용 2  (0) 2023.10.12