DEV/Spring

[JPA] QueryDSL 설정하기

l-eazzy 2023. 10. 16. 16:43

0. 관련 포스팅

 

1. 개요

QueryDSL 설정하면서 생겼던 오류와 해결 방법에 대해서 적은 포스팅이다.

 

QueryDSL에 대한 설명은 따로 정리할 생각이고

SpringBoot 2.6, 3.0 버전으로 바뀌면서 생겼던 부분에 대한 내용이다.

 

 

 

현재 기준(23.10.16) QueryDSL 은 5.0 버전이 최신이고,

Java 8 이상 부터 작동한다. (이전 버전의 경우 4.x 버전의 QueryDSL을 사용하면 된다.)

 

 

2. build.gradle

아래 gradle 파일은 필요 외 설정은 빼두었으니 QueryDSL에 해당하는 부분만 옮겨 적으면 된다.

buildscript {
    ext {
        queryDslVersion = "5.0.0"
    }
}


plugins {
    id 'java'
    id 'org.springframework.boot' version '3.1.4'
    id 'io.spring.dependency-management' version '1.1.3'
    //querydsl plugin 추가
    id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
}

...

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'


//    querydsl
//    2.6 under
//    implementation "com.querydsl:querydsl-jpa:${queryDslVersion}"
//    > spring boot 2.6 over 3.0 under
//    implementation "com.querydsl:querydsl-jpa:${queryDslVersion}"
//    implementation "com.querydsl:querydsl-apt:${queryDslVersion}"

    //spring boot 3.0 over > querydsl 추가
    implementation "com.querydsl:querydsl-jpa:${queryDslVersion}:jakarta"
    annotationProcessor "com.querydsl:querydsl-apt:${queryDslVersion}:jakarta"
    annotationProcessor "jakarta.annotation:jakarta.annotation-api"
    annotationProcessor "jakarta.persistence:jakarta.persistence-api"
    
    ...

}

...

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

 

a. 공통

QueryDSL 은 SpringBoot Starter 패키지에 포함되어있지 않아서 Plugin을 추가해준다.

plugins {
	...
    //querydsl plugin 추가
    id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
}

 

QueryDSL 사용에 있어서 Q도메인 파일이 생성이 되야 하는데,

아래 설정은 Q도메인 파일을 어디에 생성할건지와 기타(Complie 등) 설정에 대한 부분이다.

// 선택사항
buildscript {
    ext {
        queryDslVersion = "5.0.0"
    }
}

//------- 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 추가 설정 끝
  • querydsl : 추가 설정 옵션(JPA 사용여부, 파일 디렉토리 설정)
  • sourceSets : 빌드 시 사용될 SourceSet 위치
  • configuration : compileCalsspath를 상속하도록 설정
  • compileQuerydsl : QueryDSL 컴파일 시 사용할 설정

 

컴파일 옵션 관련 내용은 아래 ComplieOptions 클래스 파일을 확인해보면 좋을듯 하다.

 

 

b. Spring Boot 2.6 이상

2.6 버전 이상부터는 APT(Annotation Processing Tool) 을 추가하게 되었다.

APT는 한국어로 번역하면 주석처리기라고 하는데 Complie 시점에서 Annotation 코드를 생성하는 기능을 한다고 보면 된다.

우리가 주로 사용되는 Lombok의 @Getter, @Setter, @Builder 등을 생각하면 된다.

implementation "com.querydsl:querydsl-jpa:${queryDslVersion}"
implementation "com.querydsl:querydsl-apt:${queryDslVersion}"

 

 

c. Spring Boot 3.0 이상

Spring Boot 버전이 바뀌어가면서 JPA를 사용할 때도 jakarta 로 바뀐걸 경험이 있을것이다.

QueryDSL 도 마찬가지로 변경이 되었는데 뒤에 부분에 jakarta를 붙여주면 된다.

//spring boot 3.0 over > querydsl 추가
implementation "com.querydsl:querydsl-jpa:${queryDslVersion}:jakarta"
annotationProcessor "com.querydsl:querydsl-apt:${queryDslVersion}:jakarta"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"

 

여담이지만,

jakarta로 바뀐 이유가 Java가 Oracle에서 Eclipse 제단으로 바뀌면서 

기존 JavaEE가 JakartaEE로 변경이 되었다고

JPA도 비지니스 명칭이 Jakarta Persistence Application 으로 바뀌면서 적용된 부분이라고 한다.

 

 

3. 마무리

이전에 왜 jakarta로 바뀌었나 의문이었는데,

다른 공부하면서 찾게되어서

원인과 결과가 확실히 있구나 하는 생각이 들었다

 

Hibernate나 Jooq는 사용해본적이 있는데,

QueryDSL은 이번에 공부해보기로 해서

앞으로 공부하면서 정리된 내용을 조금씩 포스팅해보려한다.

 

 

4. 참고자료

 

Querydsl - Unified Queries for Java

5.0 5.0.0 (22.7.2021) This release of QueryDSL targets Java 8 minimally and comes with various improvements to make QueryDSL ready for the modern Java ecosystem. This version also removes joda-time:joda-time, com.google.guava:guava and com.google.code.find

querydsl.com

 

[Querydsl] 프로젝트 설정 및 테스트

스프링 부트 2.6 이상은 아래 글을 참고해주세요. 2022.08.23 - [Querydsl] - 스프링부트 2.6 이상 버전에서 Querydsl 설정 방법 모든 소스 코드는 여기 있습니다. Querydsl을 사용하기 위해 프로젝트 설정부터

jaime-note.tistory.com

 

JPA - QueryDSL

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

velog.io

 

Jakarta Persistence & JPA

굳이 알아야 할 필요는 없다. 하지만, 알고 있으면 내가 그만큼 이 기술에 관심이 많다는 뜻이다.외국의 다양한 레퍼런스를 검색하는 도중 J2EE로 구현한 기술들을 발견하게 되었고, 그 기술에서

velog.io

 

애노테이션 프로세서(Annotation processor)

Annotation Processor란? Annotation Processor는 컴파일 단계에서 Annotation에 정의된 일렬의 프로세스를 동작하게 하는 것을 의미합니다. 컴파일 단계에서 실행되기 때문에, 빌드 단계에서 에러를 출력하게

roadj.tistory.com

 

728x90