Querydsl
Querydsl은 JPA와 Spring Data JPA만 사용했을 시에 발생하는 여러 문제점을 해결하기 위해 나온 프레임워크다.
간단하게 문제점을 몇 가지 살펴보면 다음과 같다.
Spring Data JPA가 기본적으로 제공해주는 CRUD의 인터페이스를 사용하더라도 복잡한 동적 쿼리 등을 작성하기 위해서는 JPQL 작성을 피할 수 없다. 간단한 경우에는 크게 문제가 되지 않지만 복잡한 로직의 경우 별도로 문자열 처리 등을 하면서 재사용하기 어려운 코드들이 만들어진다. 또 JPQL로 작성한 쿼리는 문자열이다보니 컴파일 타임에 로직 상의 에러가 발생하지 않게 되고 에러를 맞이하는 시점은 런타임에 발생하게되고 장애로 이어진다.
Querydsl 설정
강의와 블로그등을 참조하면 설정을 하는데도 불구하고 버전에 차이가 생기면서 생각보다 애를 먹었다.
현재 아래의 build.gradle
을 복사해서 누군가 쓰더라도 지금 필자의 기준에서는 정상 동작하지만 다른 사람은 또 에러가 발생할 수도 있어서 참고하는 용도로만 사용하면 된다.
Querydsl을 위해서 추가한 설정은 주석을 달아놨으니 참고하면 된다.
build.gradle
buildscript {
ext{
queryDslVersion = "5.0.0"
}
}
plugins {
id 'org.springframework.boot' version '2.7.0'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
// querydsl
id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
}
group = 'study.jpa'
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}"
implementation "com.querydsl:querydsl-apt:${queryDslVersion}"
implementation "com.querydsl:querydsl-core:${queryDslVersion}"
}
// 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
}
tasks.named('test') {
useJUnitPlatform()
}
Querydsl Build
위에서 build.gradle을 수정하고 정상적으로 패키지들이 로드되어서 Querydsl 설정이 잘 끝났다면 gradle 메뉴에 Querydsl을 빌드하는 버튼이 생겨야한다.
해당 버튼을 더블 클릭 후 실행하자.
Gradle Menu > other > compileQuerydsl
빌드 결과
정상적으로 빌드에 성공했다면 아래와 같은 메세지가 나온다.
Q-Type Class
이제 빌드가 되었으니 빌드된 결과물인 Q-Type 클래스들이 생성 되었을 것이다.
빌드 경로는 build.gradle에서 별도로 설정하지 않았다면 기본 경로로 설정되고 현재 나는 별도로 $buildDir/generated/querydsl
라는 경로를 설정했다.
$buildDir
은 build
디렉토리를 의미하고 그 하위에 generated/querydsl
이란 경로로 결과물이 저장된다.
성공적으로 Entity로 생성되었던 클래스들이 Q라는 문자가 붙은 형태로 클래스가 만들어젔다.
Q-Type 클래스
들이 생성되었다면 이제 비즈니스 로직을 작성할 때 임포트해서 사용이 가능하다.
Querydsl의 빌드 결과물 build디렉토리 하위로 설정한 이유
보통 querydsl의 빌드 된 결과물은 github에 올리지 않는다.
타겟 디렉토리를 build 디렉토리 하위에 generated로 설정해서 자동으로 .gitignore를 통해 build디렉토리가 이미 등록되어있어 제외되도록 한다.
최초 동작 테스트
// ... //
import static org.assertj.core.api.Assertions.*;
@SpringBootTest
@Transactional
class QuerydslApplicationTests {
@Autowired
EntityManager em;
@Test
void contextLoads() {
Hello hello = new Hello();
em.persist(hello);
JPAQueryFactory query = new JPAQueryFactory(em);
QHello h = QHello.hello;
Hello result = query
.selectFrom(h)
.fetchOne();
assertThat(result).isEqualTo(hello);
assertThat(result.getId()).isEqualTo(hello.getId());
}
}
최초 동작을 테스트해보는 코드를 작성해서 확인을 해본다.
Hello라는 객체를 만들어서 생성한 후 JPAQueryFactory를 통해서 select해오고 비교해보는 코드다.
여기까지 정상동작이 확인되면 Querydsl을 사용할 준비가 끝났다.
'SpringBoot' 카테고리의 다른 글
[JPA 활용] 지연 로딩과 조회 성능 최적화 - 엔티티 직접 노출하기 (0) | 2022.07.05 |
---|---|
JPA 변경 감지와 병합 정리 (0) | 2022.06.19 |
HTTP Status Code 제어 및 Exception Handling (0) | 2022.04.04 |
User Service API 구현 (0) | 2022.03.22 |