728x90
Querydsl
SQL, JPQL을 코드로 작성할 수 있도록 도와주는 빌더 API
JPA Criteria에 비해서 편리하고 실용적이다
1. Querydsl 장점
- 고정된 SQL문이 아닌 동적으로 쿼리를 생성할 수 있다.
- 쿼리 재사용 제약 조건 조립 및 가독성 향상
- 문자열X 자바 소스코드로 작성 -> 컴파일 시점에서 오류 발견 가능
- IDE의 도움으로 자동완성이 가능 -> 생산성 향상
2 build.gradle 설정
- 사용하기에 앞서 몇 가지 설정이 필요하다.
// 1. queryDsl version 정보 추가
buildscript {
ext {
queryDslVersion = "5.0.0"
}
}
plugins {
id 'org.springframework.boot' version '2.7.4'
id 'io.spring.dependency-management' version '1.0.14.RELEASE'
// 2. querydsl plugins 추가
id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
id 'java'
}
group = 'hello'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
// 3. querydsl dependencies 추가
implementation "com.querydsl:querydsl-jpa:5.0.0"
annotationProcessor "com.querydsl:querydsl-apt:5.0.0"
//...
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.session:spring-session-core'
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'org.springframework.boot:spring-boot-starter-security'
//spy6
implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.7.1'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'mysql:mysql-connector-java'
runtimeOnly 'com.h2database:h2'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
test {
useJUnitPlatform()
}
/**
* querydsl 추가 시작
*/
// querydsl에서 사용할 경로 설정
def querydslDir = "$buildDir/generated/querydsl"
// JPA 사용 여부와 사용할 경로를 설정
querydsl {
jpa = true
querydslSourcesDir = querydslDir
}
// build 시 사용할 sourceSet 추가
sourceSets {
main.java.srcDir querydslDir
}
// querydsl 이 compileClassPath 를 상속하도록 설정
configurations {
querydsl.extendsFrom compileClasspath
}
// querydsl 컴파일시 사용할 옵션 설정
compileQuerydsl {
options.annotationProcessorPath = configurations.querydsl
}
//querydsl 추가 끝
1. querydsl version 정보 추가
2. querydsl plugin 추가
3. querydsl dependencies 추가
4. querydsl 설정 추가
3. compileQuerydsl 실행
- gradle설정이 완료되었다면 Reload Gradle Project를 실행
- Gradle Tasks -> other -> compileQuerydsl 실행
4. QClass 생성 확인
- 실행이 완료되면 build/generated/querydsl 경로에 Project Entity 들의 QClass 가 생성된 것을 확인할 수 있다.
5. Querydsl 테스트
- JPAQuery에서 결과를 반환하는 메서드
메소드 | 기능 |
List <T> fetch() | 조회 결과 리스트 반환 |
T fetchOne | 조회 대상이 1건인 경우 제네릭으로 지정한 타입 반환 |
T fetchFirst() | 조회 대상 중 1건만 반환 |
Long fetchCount() | 조회 대상 개수 반환 |
QueryResult<T> fetchResults() | 조회한 리스트와 전체 개수를 포함한 QueyrResults 반환 |
- 영속성 컨텍스트 사용을 위해 @PersistenceContext 어노테이션으로 EntityManager 빈을 주입
- JPAQueryFactory를 이용 동적 쿼리를 생성(생성자 파라미터로 EntityManager 객체 주입)
- Querydsl로 쿼리 생성을 위해 Q객체 이용
- Querydsl을 이용하여 자바 소스코드이지만 SQL 비슷하게 쿼리 작성 가능
- JPAQuery 메서드 중 하나인 fetch() 사용 ㅡ> 리스트로 결과 반환
- fetch() 메소드 실행 시점에 쿼리문이 실행된다.
- 결과 코드
- where절에 추가한 판매상태 코드와 상품 상세 설명이 보인다.
- 상품 가격으로 내림차순 정렬돼 데이터를 조회한다.
728x90