Query DSL
- 오픈소스 프로젝트로 JPQL을 Java 코드로 작성할 수 있도록 하는 라이브러리이다.
- 복잡한 쿼리, 검색 조건에 따른 동적 쿼리를 쉽게 작성할 수 있다.
- 문법 오류를 컴파일 시점에 잡을 수 있다.
- 쉬운 SQL 스타일 문법이다.
Query DSL 라이브러리
- querydsl-apt : Querydsl 관련 코드 생성 기능 제공
- querydsl-jpa : Querydsl 라이브러리
Query DSL 설정
// queryDsl version 정보 추가
buildscript {
ext {
queryDslVersion = "5.0.0"
}
}
plugins {
id 'org.springframework.boot' version '2.6.0'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
// 2. querydsl plugins 추가
id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
id 'java'
}
group = 'study'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
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'
// querydsl dependencies 추가
implementation "com.querydsl:querydsl-jpa:${queryDslVersion}"
implementation "com.querydsl:querydsl-apt:${queryDslVersion}"
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
test {
useJUnitPlatform()
}
// querydsl에서 사용할 경로 설정
def querydslDir = "$buildDir/generated/querydsl"
// JPA 사용 여부와 사용할 경로를 설정
querydsl {
jpa = true
querydslSourcesDir = querydslDir
}
// build 시 사용할 sourceSet 추가
sourceSets {
main.java.srcDir querydslDir
}
// querydsl 컴파일시 사용할 옵션 설정
compileQuerydsl{
options.annotationProcessorPath = configurations.querydsl
}
// querydsl 이 compileClassPath 를 상속하도록 설정
configurations {
compileOnly {
extendsFrom annotationProcessor
}
querydsl.extendsFrom compileClasspath
}
- Gradle 5.0 일 때 Query DSL 설정 방법
- 해당 설정에서는 build/generated/querydsl 에서 QClass 를 생성하도록 하였다.
- compileQuerydsl 모듈을 실행 시 QClass 가 만들어지는 것을 볼 수 있다.
- QClass 는 시스템이 자동으로 Generate 해주는 파일이기 때문에 gitignore 하여 관리해야 한다.
Query DSL 테스트
@SpringBootTest
@Transactional
class QuerydslApplicationTests {
@PersistenceContext
EntityManager em;
@Test
void contextLoads() {
Hello hello = new Hello();
em.persist(hello);
JPAQueryFactory query = new JPAQueryFactory(em);
QHello qHello = QHello.hello;
Hello result = query
.selectFrom(qHello)
.fetchOne();
Assertions.assertThat(result).isEqualTo(hello);
Assertions.assertThat(result.getId()).isEqualTo(hello.getId());
}
}
- 저장된 Entity 와 QClass 를 통해서 select 한 Entity 가 동일한 것을 볼 수 있다.
Import