QueryDSL 공식문서
실무에서는 조건에 따라서 실행되는 쿼리가 달라지는 동적 쿼리를 많이 사용합니다. 근데 JPQL 을 사용하면 동적 쿼리에 대한 이슈가 있습니다. JPQL 로 동적 쿼리를 만드려면 문자 더하고 뭐 더하고 하면서 굉장히 복잡해집니다.
이런 문제를 해결한 게 바로 QueryDSL 입니다.
QueryDSL 은 JPQL 을 자바코드로 작성할 수 있게 도와줍니다.
주문 검색 기능을 Querydsl 로 바꿔보겠습니다.
주문 검색 기능을 동적 쿼리로 해결한 기존의 코드들을 보면 굉장히 복잡했습니다. 이런게 결국 버그를 발생시킬 확률이 높아지죠.
마이바티스가 인기 있는 이유가 동적 쿼리에 장점이 있기 때문이죠. 실제로 동적 쿼리에 대한 복잡함을 많이 해결해주니까요.
그럼에도 맘에 안드니까 Querydsl 을 만들어서 썼겠죠?
Querydsl 을 만들기 위해서는 먼저 Q 파일을 생성해야 합니다. 이게 조금 단점이죠.
먼저 빌드 스크립트에 추가를 해봅시다.
**//querydsl 추가
buildscript { //...1
dependencies {
classpath("gradle.plugin.com.ewerk.gradle.plugins:querydsl-plugin:1.0.10")
}
}**
plugins {
id 'org.springframework.boot' version '2.5.6'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
}
group = 'jpabook'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
**//apply plugin: 'io.spring.dependency-management'
apply plugin: "com.ewerk.gradle.plugins.querydsl" //...1**
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-devtools'
implementation 'com.fasterxml.jackson.datatype:jackson-datatype-hibernate5'
implementation("com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.8.0")
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.h2database:h2'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
//JUnit4 추가
testImplementation("org.junit.vintage:junit-vintage-engine") {
exclude group: "org.hamcrest", module: "hamcrest-core"
}
**//querydsl 추가
implementation 'com.querydsl:querydsl-jpa'
//querydsl 추가
implementation 'com.querydsl:querydsl-apt'**
}
test {
useJUnitPlatform()
}
**//querydsl 추가
def querydslDir = 'src/main/generated'
//def querydslDir = "$buildDir/generated/querydsl"
//...3
querydsl {
library = "com.querydsl:querydsl-apt"
jpa = true
querydslSourcesDir = querydslDir
}
//...3
sourceSets {
main {
java {
srcDirs = ['src/main/java', querydslDir]
}
}
}
//...2
compileQuerydsl{
options.annotationProcessorPath = configurations.querydsl
}
//...2
configurations {
querydsl.extendsFrom compileClasspath
}**
플러그인 세팅
아래처럼 세팅하면 안되는지 체크 필요
plugins { id 'org.springframework.boot' version '2.5.6.RELEASE' id 'io.spring.dependency-management' version '1.0.8.RELEASE' //querydsl 추가 id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" id 'java' }