JPA - QueryDSL

문지원(JiwonMoon)·2022년 4월 22일
1
post-thumbnail

QueryDSL 이란?

QueryDSL이란? 정적 타입을 이용해서 SQL과 같은 쿼리를 생성할 수 있도록 해주는 프레임워크이고, Type-safe한 쿼리를 위한 Domain Specific Language이다.

즉, QueryDSL은 SQL, JPQL을 코드로 작성할 수 있도록 도와주는 오픈소스 빌더 API이다.

Querydsl 버전에 따른 차이

  • 4.0.1 버전까지는 list 조회 시 .list() 메서드를 사용
  • 4.0.2 버전부터는 fetch() 메서드로 이름이 변경됨

QueryDSL 의 사용 목적

SQL query는 문자이다. 이는 type-check가 불가능하고 실행해 보기 전까지 작동여부 확인이 어렵다.
SQL이 class처럼 Type이 있고, Java코드로 작성할 수 있는 방법을 위해 나온 것이,
SQL을 java로 type-safe하게 개발 할 수 있게 해주는 프레임워크 Querydsl이다. 또한 QueryDSL은 JPQL(HQL)을 type-safe하게 작성하기 위해서 만들어졌고 다음처럼 동작한다.

Querydsl -> JPQL -> SQL

QueryDSL 의 장점

  1. IDE의 코드 자동 완성 기능을 사용한다.
  2. 문법적으로 잘못된 쿼리를 허용하지 않는다.
  • 덕분에 컴파일 시점에 문법 오류를 발견할 수 있어서 빠른 대처가 가능하다.
  1. 도메인 타입고 프로퍼티를 안전하게 참조할 수 있다.
  2. 도메인 타입의 리팩토링을 더 효율적으로 진행할 수 있다.
  3. 동적 쿼리를 만들기 쉽다.

Gradle build.gradle 설정

gradle 5.0 이상부터는 아래와 같이 설정해줘야 한다고 한다.

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'
   //querydsl 추가
   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 추가
   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"

querydsl {
   jpa = true
   querydslSourcesDir = querydslDir
}
sourceSets {
   main.java.srcDir querydslDir
}
compileQuerydsl{
   options.annotationProcessorPath = configurations.querydsl
}
configurations {
   compileOnly {
      extendsFrom annotationProcessor
   }
   querydsl.extendsFrom compileClasspath
}
//querydsl 추가 끝

설정을 마치고 나면

검증용 Q 타입 생성

Gradle IntelliJ 사용법

  • Gradle → Tasks → build → clean
  • Gradle → Tasks → other → compileQuerydsl

Gradle 콘솔 사용법

./gradlew clean compileQuerydsl

Q타입 생성 확인

  • build → generated → querydsl
    study.querydsl.entity.QHello.java (예제를 Hello로 만들었기 때문) 파일이 생성되어 있어야 한다.

위의 설정은 엔티티를 기반으로 prefix 'Q'가 붙는 클래스들을 자동 생성한다. 즉, Member라는 엔티티 클래스가 있다고 하면 Querydsl에서 QMember라는 클래스를 생성한다. apt-maven-plugin 은 APT와 통합되어져 있기 때문에 엔티티에 존재하는 애노테이션을 기반으로 'Q'가 붙는 새로운 코드와 파일을 만들어 주는 것이다.

APT란?

Annotation Processing Tool 의 약자로 JDK 1.6 부터 도입되었다. APT은 Annotation 이 있는 기존코드를 바탕으로 새로운 코드와 새로운 파일들을 만들 수 있고, 이들을 이용한 클래스에서 compile 하는 기능도 지원해준다. APT를 이용해서 새롭게 생성되어진 QDslMember은 다음과 같은 구조로 생성되어진다. 만약 원본이 되는 DslMember 클래스의 특정 필드가 변경이 되거나 추가된다면 mvn package 를 재실행 해야 한다.

사용방법

querydsl을 이용해 쿼리를 작성하기 위해서는 QueryDslRepositorySupport 상속받아야 하며
super(DslMember.class); 처럼 도메인 엔티티 클래스를 슈퍼 타입인 QueryDslRepositorySupport 생성자의 아규먼트로 넘겨줘야 한다.

0개의 댓글