Querydsl 설정 SpringBoot3

qufdl·2023년 5월 25일
0

Spring Boot

목록 보기
1/5
post-thumbnail

JPA에서는 엔티티 객체를 조회하는 객체지향 쿼리인 JPQL을 지원합니다.

ex)

String jpql = "select m from Member as m where m.username = 'kim'";

JPQL은 쿼리를 문자열로 입력하기 때문에 오타가 발생할 위험이 있고, type-check가 불가능합니다.

또한 컴파일 단계에서 오류를 확인할 수 없고, 런타임 시점에서 해당 쿼리가 실행되어야 오류를 발견할 수 있다는 문제점이 있습니다.

Querydsl은 이러한 문제점을 해결해줄 수 있습니다.

Querydsl이란?

Querydsl은 정적 타입을 이용해서 SQL 등의 쿼리를 생성해주는 오픈소스 프레임워크입니다. Querydsl은 다음과 같은 장점이 있습니다.

  1. 쿼리를 문자가 아닌 코드로 작성함으로써 컴파일 시점에 문법 오류를 쉽게 확인할 수 있다.
  2. 동적인 쿼리 작성이 편리하다.
  3. 쿼리 작성 시 제약 조건 등을 메서드 추출을 통해 재사용할 수 있다.

대신 Querydsl을 사용하기 위해선 별도의 gradle 설정이 필요합니다.

저는 Spring boot data JPA와 같이 사용했습니다. Querydsl과 Spring boot 버전에 따라 설정 방법이 달라지기 때문에 유의해야 합니다.

Querydsl 환경설정

1. Spring boot 2.6 이상, Querydsl 5.0

: querydsl-jpa , querydsl-apt 를 추가하고 버전을 명시해야 합니다.

build.gradle

buildscript {
    ext {
        queryDslVersion = "5.0.0"
    }
}

plugins {
    id 'java'
    id 'org.springframework.boot' version '2.7.10' //2.6 이상일 때 적용
    id 'io.spring.dependency-management' version '1.0.15.RELEASE'
    //querydsl 추가
    id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
}
...

dependencies {

    //querydsl 추가
    implementation "com.querydsl:querydsl-jpa:${queryDslVersion}"
    annotationProcessor "com.querydsl:querydsl-apt:${queryDslVersion}"
...
}

//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 추가 끝

Gradle > Tasks > other > compileQuerydsl 클릭 => Q 객체 생성됨

build > generated > querydsl 폴더를 확인하면 Q Class가 생성된 것을 확인할 수 있습니다.

QClass는 Entity와 형태가 똑같은 Static Class다. Querydsl은 QClass를 기반으로 쿼리를 실행한다.

2. Spring boot 3.0 이상, Querydsl 5.0

: gradlew로 빌드할 때 문제가 있어서 플러그인은 사용하지 말아야 합니다.

build.gradle

plugins {
    id 'java'
    id 'org.springframework.boot' version '3.0.6' //3.0 이상
    id 'io.spring.dependency-management' version '1.1.0'

//    id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" Querydsl 플러그인 사용X
}
...
dependencies {
    ...
    //querydsl
    implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
    annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
    annotationProcessor "jakarta.annotation:jakarta.annotation-api"
    annotationProcessor "jakarta.persistence:jakarta.persistence-api"

}

//QueryDsl 빌드 옵션 (선택)
def querydslSrcDir = 'src/main/generated'
clean {
    delete file(querydslSrcDir)
}
tasks.withType(JavaCompile) {
    options.generatedSourceOutputDirectory = file(querydslSrcDir)
}

어플리케이션을 실행하면 src > main > generated 위치에 QClass가 생성됩니다.

QuerydslConfig

아래와 같이 JPAQueryFactory를 빈으로 등록하는 코드를 작성하면 어디에서나 JPAQueryFactory를 주입받아 QueryDSL을 사용할 수 있게 됩니다.

@Configuration
public class QuerydslConfig {

    @PersistenceContext
    private EntityManager entityManager;

    @Bean
    public JPAQueryFactory jpaQueryFactory() {
        return new JPAQueryFactory(entityManager);
    }
}

Referece

https://velog.io/@mooh2jj/QueryDSL%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0
https://velog.io/@juhyeon1114/Spring-QueryDsl-gradle-%EC%84%A4%EC%A0%95-Spring-boot-3.0-%EC%9D%B4%EC%83%81

0개의 댓글