QueryDSL 사용 이유?

<aside> ☑️ JPQL의 경우, 정적 쿼리는 실행 시 에러가 발생하나 동적 쿼리는 런타임 시 에러가 발생한다

따라서, 동적 쿼리 디버깅을 용이하게 하기 위해 QueryDSL을 적용한다

</aside>

[JPA] QueryDSL 소개 및 장점

주니어 개발자의 QueryDSL 찔러보기

build.gradle 변경

// QueryDSL 5.0이상 부터는 아래 옵션 추가
 plugins {
 	...
 	id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
 	...
 }
 ...
 dependencies {
 	// querydsl 추가
 	implementation "com.querydsl:querydsl-jpa:5.0.0"
 	implementation "com.querydsl:querydsl-apt:5.0.0"
     ...
 }
 // Qtype 생성 경로
 def querydslDir = "$buildDir/generated/querydsl"
 querydsl {
 	jpa = true
 	querydslSourcesDir = querydslDir
 }
 sourceSets {
 	main.java.srcDir querydslDir
 }
 compileQuerydsl{
 	options.annotationProcessorPath = configurations.querydsl
 }
 configurations {
 	compileOnly {
 		extendsFrom annotationProcessor
 	}
 	querydsl.extendsFrom compileClasspath
 }

⇒ Unable to load class 'javax.persistence.Entity'. 에러 발생

[Spring] QueryDsl gradle 설정 (Spring boot 3.0 이상)

plugins {
	...
}

...

dependencies {
	...

	// Spring boot 3.x이상에서 QueryDsl 패키지를 정의하는 방법
	implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
	annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta"

	//QueryDSL에서 Entity를 찾지 못하는 문제 방지
	annotationProcessor "jakarta.annotation:jakarta.annotation-api"
	annotationProcessor "jakarta.persistence:jakarta.persistence-api"

...
}

...

// QueryDsl 빌드 옵션 (선택)
def querydslDir = "$buildDir/generated/querydsl"

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

tasks.withType(JavaCompile) {
	options.annotationProcessorGeneratedSourcesDirectory = file(querydslDir)
}

clean.doLast {
	file(querydslDir).deleteDir()
}

⇒ Attempt to recreate a file for type QBase 에러 발생

gradle 탭에서 build -> clean 실행하기

QueryDSL의 동작과정

  1. @Entity 클래스를 탐색한다
  2. Q-class(쿼리 타입)를 생성한다 (관리할 클래스가 많아지는 단점이 존재한다)