[Spring JPA] QueryDsl 세팅

SangYu Lee·2023년 2월 21일
0
post-custom-banner

Version : QueryDsl 4.4.0 & Spring Boot 2.7.6

QueryDsl은 초보 개발자에게는 세팅이 어려운 것 같다. 왜 그냥 spring을 사람들이 세팅이 어려워서 못쓰겠다고 했는지 십분 이해할 것 같다.

  • querydsl document를 봐도 build.gradle 설정은 찾을 수가 없고 구글링해도 저마다 설정이 다 다르다

이건 내가 성공했던 설정이며 참고했던 글이다 4.4.0 버전과 5.0.0 버전의 세팅 차이가 있다.

세팅 참고자료

build.gradle

buildscript {
	ext {
		queryDslVersion = "4.4.0"
	}
}
...
dependencies {
	implementation "com.querydsl:querydsl-jpa"
	implementation "com.querydsl:querydsl-core"
	implementation "com.querydsl:querydsl-collections"
	annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jpa"
	annotationProcessor "jakarta.annotation:jakarta.annotation-api"
	annotationProcessor "jakarta.persistence:jakarta.persistence-api"

}

// QueryDsl 
sourceSets {
	main {
		java{
			srcDirs = ["$projectDir/src/main/java", "$projectDir/build.generated"]
		}
	}
}
...

1) implementation

참고) http://querydsl.com/static/querydsl/4.4.0/apidocs/

QueryDsl 4.4.0 버전의 apidocs다. jpa, apt를 추가하였으며 내 스프링부트 2.7.6버전 기준 하나가 없으면 QClass를 찾을 수 없다는 에러가 발생하였다.

2) annotationProcessor

annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"

기본적으로 QueryDSL은 프로젝트 내의 @Entity 어노테이션을 선언한 클래스를 탐색하고, JPAAnnotationProcessor를 사용해 Q 클래스를 생성한다.

querydsl-apt가 @Entity 및 @Id 등의 애너테이션을 알 수 있도록, jakarta.persistence과 jakarta.annotation을 annotationProcessor에 함께 추가한다

TMI : JAVA는 오라클이 가지고 있는 브랜드인데, JAVA EE를 오픈소스화하고 이클립스에게 넘길 때 이름을 바꾸라고 해서 투표를 통해 jpa의 이름을 java persistence api에서 jakarta persistence api로 변경한 것이라고 한다

annotationProcessor는 Java 컴파일러 플러그인으로서, 컴파일 단계에서 어노테이션을 분석 및 처리함으로써 추가적인 파일을 생성한다.

3) sourceSet에 generated 추가

개발 환경에서 생성된 Q 클래스를 사용할 수 있도록 generated 디렉토리를 sourceSet에 추가한다.

IDE의 개발 코드에서 생성된 Q 클래스 파일에 접근할 수 있게 된다.

🤔 QClass는 무엇일까?

Q class는 쿼리 클래스라고도 하는데 Querydsl에서는 엔티티로 설정된 클래스에 Q모델이라는 쿼리타입 클래스를 미리 생성해놓고 메타데이터로 사용하여 쿼리를 메소드 기반으로 작성한다.

QueryDsl을 설정하고 난 후 CompileJava나 build를 한다면 지정한 디렉토리에 Q Classs가 생성이 되는데 예를 들어 내 댓글 entity 기준으로

이런 Q class가 생성된다(모든 필드를 캡쳐하지는 않았다)

QueryDsl이 나의 댓글 엔티티를 사용하는 쿼리를 짜고 싶은데, 클래스의 필드는 객체를 생성해야 접근할 수 있다. 그래서 미리 컴파일 할때 댓글 엔티티를 대표하는 static 메타데이터인 QComment를 생성하고 querydsl이 static 하게 사용하는 것이다.

=> Q라는 네이밍은 default 값이며, 설정에서 바꿔줄 수도 있다.

참고) http://querydsl.com/static/querydsl/latest/reference/html/ch02.html#d0e184
https://stackoverflow.com/questions/16662089/what-is-querydsl-q

profile
아이스커피
post-custom-banner

0개의 댓글