본문 바로가기
Java & Kotlin/Spring Data

[QueryDSL] QueryDSL 시작하기

by heekng 2022. 5. 10.
반응형

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-jpaquerydsl-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