반응형
QueryDSL 시작하기
- JPA와 Spring Data Jpa를 사용하면서 동적인 쿼리를 더 잘 사용하기 위해 QueryDSL을 배우기로 했다.
- JPQL을 사용하는 것과 다르게 QueryDSL을 사용하면 몇가지 이점이 있다.
- 쿼리를 문자가 아닌 코드로 작성하기 때문에 compile시점에 에러를 잡을 수 있다.
- 쉽고 간결하다.
- 형태가 쿼리와 비슷하다.
- 쿼리(데이터)를 조회하는 데 기능이 특화되어 있다.
프로젝트 설정하기
build.gradle
buildscript {
ext {
queryDslVersion = "5.0.0"
}
}
plugins {
id 'org.springframework.boot' version '2.6.7'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
//querydsl 추가
id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
}
group = 'com.heekng'
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'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
//querydsl 추가
implementation "com.querydsl:querydsl-jpa:${queryDslVersion}"
annotationProcessor "com.querydsl:querydsl-apt:${queryDslVersion}"
}
tasks.named('test') {
useJUnitPlatform()
}
//querydsl 추가
def querydslDir = "$buildDir/generated/querydsl"
querydsl {
jpa = true
querydslSourcesDir = querydslDir
}
sourceSets {
main.java.srcDir querydslDir
}
configurations {
querydsl.extendsFrom compileClasspath
}
compileQuerydsl {
options.annotationProcessorPath = configurations.querydsl
}
- QueryDSL 5버전 이후부터는
querydsl-jpa
와querydsl-apt
의존성에 버전을 명시해주어야 한다.querydsl-jpa
: QueryDSL JPA 라이브러리querydsl-apt
: 쿼리 타입(Q)을 생성할 때 필요한 라이브러리
- 아래의 compile 설정에서 querydslDir은 사용자의 설정에 맞추어 설정한다.
QType
QueryDSL을 사용하려면 Criteria의 메타 모델처럼 엔티티를 기반으로 쿼리 타입이라는 쿼리용 클래스를 생성해야 한다.
QType 생성하기
- QueryDSL QType을 compile한다.
build.gradle
에 설정한대로 QType을 컴파일한다.
QueryDSL 사용 코드 작성하기.
@PersistenceContext
EntityManager em;
...
JPAQueryFactory queryFactory = new JPAQueryFactory(em);
...
QueryDSL
을 사용하려면com.mysema.query.jpa.impl.JPAQueryFactory
객체를 생성해야 한다.- 이 때
EntityManager
을 생성자에 넣어주면 해당EntityManager
을 이용해 쿼리를 전송한다.
- 이 때
JPAQueryFactory
객체를 생성하면QueryDSL
을 사용할 준비는 완료된다.
...
QMember qMember = new QMember("[QMember name]");
QMember qMember = QMember.member;
...
- QType을 선언하는 방법은 두가지가 있다.
QMember qMember = new QMember("[QMember name]");
- 생성자를 사용해 선언한다.
[QMember name]
: 쿼리를 실행할 때 alias를 구분할 수 있으며, 하나의 쿼리에 두가지 이상의 Member 테이블을 이용할 때 구분하기 위해 사용한다.
QMember qMember = QMember.member;
- QMember 클래스에 정적으로 생성된 QMember을 가져온다.
public class QMember extends EntityPathBase<Member> {
...
public static final QMember member = new QMember("member1");
...
}
위와 같이 member1
이름의 QMember
은 static final로 선언되어 해당 QMember 인스턴스를 가져와 사용한다.
반응형
'Java & Kotlin > Spring Data' 카테고리의 다른 글
[QueryDSL] 동적쿼리 (0) | 2022.05.14 |
---|---|
[QueryDSL] 프로젝션 (0) | 2022.05.14 |
[QueryDSL] QueryDSL 기본문법 (0) | 2022.05.11 |
[JPA] UniqueConstraint와 Embedded field (0) | 2022.05.07 |
[JPA]영속성 전이 CASCADE (0) | 2022.04.21 |
[MyBatis] 동적쿼리(동적 태그) (0) | 2021.05.13 |