JPA/QueryDSL

[QueryDSL] QueryDSL 설정하기 ( SpringBoot 2.6이상, SpringBoot 3.x )

IT록흐 2023. 7. 26. 21:57
반응형

 

QueryDSL 설정은 쉽지않다.

 

인프런 김영한 강사님의 QueryDSL 강의를 수강하고 있는 학생이라면 QueryDSL 설정에 어려움을 겪고 있을 것이라 예상된다. 아무래도 강사님이 사용하는 버전이 SpringBoot 2.2.2 버전과 QueryDSL 4.4.0 버전을 사용하고 있기에 그렇다. 현재 https://start.spring.io/ 에서 제공하는 SpringBoot 버전은 2.6 이상이거나 3.x 버전이다. 

 

 

- 스프링 부트 3.x 버전 

이미지 클릭시 출처로 이동

 

- 스프링 부트 2.6 이상 버전

이미지 클릭시 출처로 이동

 

 

 

SpringBoot 2.6 이상, 3.x 버전 모두 QueryDSL 5.0.0 버전에 의존한다. 게다가 3.x 버전의 경우, 지원하는 패키지명이 javax에서 jakarta로 변경되었다. 이런 저런 이유로 현재 인터넷상에는 QueryDSL 설정관련 정보가 복잡하게 난립하고 있다. 그래서 이번 포스팅에서는 QueryDSL 설정을 두 가지 경우로 나누어 정리해볼까 한다.

 

 

1) SpringBoot 2.6 이상 + QueryDSL 5.0.0

 

build.gradle

// QueryDSL 버전정보 추가
buildscript {
	ext {
		queryDslVersion = "5.0.0"
	}
}
plugins {
    // 중략...

	//querydsl 플러그인 추가
	id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
}

// 중략...

dependencies {
	//중략...
    
	// QueryDSL
	implementation "com.querydsl:querydsl-jpa:${queryDslVersion}"
	implementation "com.querydsl:querydsl-apt:${queryDslVersion}"
	implementation "com.querydsl:querydsl-core:${queryDslVersion}"

}

//QueryDSL 플로그인 설정 START

def querydslDir = "$buildDir/generated/querydsl" //QueryDSL로 생성된 소스가 저장되는 위치

querydsl {
	jpa = true //JPA 사용여부 설정
	querydslSourcesDir = querydslDir
}

sourceSets {
	main.java.srcDir querydslDir// 빌드시 컴파일이 필요한 소스위치
}

//QueryDSL 컴파일시 참조할 설정정보
compileQuerydsl{
	options.annotationProcessorPath = configurations.querydsl
}

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
	querydsl.extendsFrom compileClasspath //외부라이브러리 컴파일 경로 상속
}

//QueryDSL 플로그인 설정 END

 

 

SpringBoot 2.6 이상을 사용하면 2가지 특징이 있다.

 

- QueryDSL 5.0.0 지원

- QueryDSL Gradle 플러그인 사용

 

Gradle 플러그인이란 Gradle에서 동작하는 Task 모음이다. QueryDSL 프레임워크는 Q타입클래스를 컴파일하여 생성해야 한다. Gradle이 QuerDSL 관련 task를 지원할 수 있도록 플러그인을 추가하고 설정하는 작업이 필요하다. 위 build.gradle을 보면 QueryDSL버전정보를 명시하고 플러그인을 추가하고 디펜던시를 추가한 뒤, QuerdyDSL Task 관련 설정이 이루어짐을 알 수 있다.  설정을 추가하고 build.gradle을 실행하면 아래와 같이 QueryDSL 관련 Task를 실행할 수 있다.

 

 

 

build clean을 진행하고 compileQuerydsl Task를 실행하면 지정된 위치에 아래와 같은, Q타입 클래스가 생성된다. 

 

 

 

Q타입 클래스는 엔티티를 추적하여 자동으로 생성되는 클래스로 자세한 내용은 아래 포스팅을 참고하기를 바란다. 

 

 

[QueryDSL] QueryDSL이란?

QueryDSL이란? DSL은 Domain Specific Language의 약자로, 특정 영역에 특화된 언어를 의미한다. 그런 의미에서 QueryDSL은 쿼리생성에 특화된 프레임워크를 의미한다. 그럼 QueryDSL이 필요한 이유는 무엇일까?

lordofkangs.tistory.com

 

이렇듯, SpringBoot 2.6 이상 버전의 경우 QueryDSL 설정이 굉장히 복잡하다.  QueryDSL 플러그인을 따로 추가하고 플러그인 관련 설정도 해야하기에 발생하는 문제이다. 

 

 

2) SpringBoot 3.x + QueryDSL 5.0.0

 

build.gradle

	//중략 ...
    
dependencies {
	//중략 ...
	//querydsl dependencies 추가(스프링부트 3.0 이상)
	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"

}

def querydslSrcDir = 'src/main/generated'
clean {
	delete file(querydslSrcDir)
}
tasks.withType(JavaCompile) {
	options.generatedSourceOutputDirectory = file(querydslSrcDir)
}

 

SpringBoot 3.x 버전을 사용하면 세 가지 특징이 있다. 

 

1) jakarta 패키지명 사용

2) QueryDSL 플러그인 사용 X

3) QueryDSL 버전 명시 X

 

SpringBoot 3.x 버전은 확실히 2.6이상 버전보다 설정이 간단해졌다.

 

SpringBoot 3.x 버전은 QueryDSL 플러그인을 추가하지 않기 때문이다. 그렇다면 Q타입클래스 생성을 어떻게 해야할까? 위 설정을 보면 알겠지만, JavaCompile Task와 같이 동작하도록 설정해놓았다. 즉, 따로 플러그인을 추가하지 않고 Gradle 내부 Task와 같이 동작하도록 변경된 것이다. 

 

 

build clean을 진행하고 complieJava Task를 실행해보자. 

 

 

컴파일하거나 빌드를 진행하면  지정된 위치에 Q타입 클래스가 생성됨을 확인할 수 있다. 

 

 

이렇듯, QueryDSL 설정은 버전별로 상이하고  QueryDSL 동작방식에 대한 이해도 필요하기에 여간 까다로운 것이 아니다. 아직 Gradle 에 대한 지식이 부족하고 QueryDSL 및 SpringBoot에 대한 이해도 많이 부족하기에 깊은 내용은 정리하지 못했다. 공부를 하고 알게 되는 내용이 있으면 추가하여 올리도록 하겠다. 

 

 

 


 

참고자료

 

스프링부트 2.6 이상 버전에서 Querydsl 설정 방법

스프링 부트 2.6 미만은 이전 글을 참고해주세요. [Querydsl] 프로젝트 설정 및 테스트 모든 소스 코드는 여기 있습니다. Querydsl 을 사용하기 위해 프로젝트 설정부터 차근차근 달려봅시다! 먼저 자

jaime-note.tistory.com

 

[springboot 3.x, querydsl] QClass 생성 및 경로 설정

springboot 2.x 와 달라진점이 있다면 plugins 에 편의상으로 추가했던 다음항목을 사용하지 못하면서 문제가 시작된다. id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" 위 플러그인을 사용하면 compileQuerdsl

lemontia.tistory.com

 

스프링 부트 2.6 이상, Querydsl 5.0 Unable to load class 'com.mysema.codegen.model.Type' 에러 해결하기

최근에 한 기업의 과제를 진행하였는데, 주제만 정해주고 기술 스택은 자유였습니다. 그래서 start.spring.io를 통해 최신 버전의 스프링 부트(버전 2.6 이상) 프로젝트를 만들었고, 프로젝트에 Spring

wangtak.tistory.com

 

실전! Querydsl - 인프런 | 강의

Querydsl의 기초부터 실무 활용까지, 한번에 해결해보세요!, 복잡한 쿼리, 동적 쿼리는 이제 안녕! Querydsl로 자바 백엔드 기술을 단단하게. 🚩 본 강의는 로드맵 과정입니다. 본 강의는 자바 백엔

www.inflearn.com

 

 

 

 

 

반응형