QueryDsl은 초보 개발자에게는 세팅이 어려운 것 같다. 왜 그냥 spring을 사람들이 세팅이 어려워서 못쓰겠다고 했는지 십분 이해할 것 같다.
이건 내가 성공했던 설정이며 참고했던 글이다 4.4.0 버전과 5.0.0 버전의 세팅 차이가 있다.
세팅 참고자료https://tecoble.techcourse.co.kr/post/2021-08-08-basic-querydsl/
https://www.inflearn.com/chats/669477/querydsl-springboot-2-7%EC%9D%98-gradle-%EC%84%A4%EC%A0%95%EC%9D%84-%EA%B3%B5%EC%9C%A0%ED%95%A9%EB%8B%88%EB%8B%A4
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"]
}
}
}
...
참고) http://querydsl.com/static/querydsl/4.4.0/apidocs/
QueryDsl 4.4.0 버전의 apidocs다. jpa, apt를 추가하였으며 내 스프링부트 2.7.6버전 기준 하나가 없으면 QClass를 찾을 수 없다는 에러가 발생하였다.
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 컴파일러 플러그인으로서, 컴파일 단계에서 어노테이션을 분석 및 처리함으로써 추가적인 파일을 생성한다.
개발 환경에서 생성된 Q 클래스를 사용할 수 있도록 generated 디렉토리를 sourceSet에 추가한다.
IDE의 개발 코드에서 생성된 Q 클래스 파일에 접근할 수 있게 된다.
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