티스토리 뷰
JPA JPQL 을 사용하던 도중 QueryDSL 로 쿼리를 짜보고 싶어 셋팅해봄.
SPRING DATA JPA 레퍼런스에 queryDSL이 언급은 되는데 설정하는 방법 같은 건 딱히 없어서
블로그들 참고하여 com.ewerk.gradle.plugins.querydsl 플러그인 방식으로 셋팅해봄.
* gradle 버전차이 인지는 모르겠는데 annotationProcessor 방식으론 이클립스에서 정상 동작 하지 않음.
먼저 build.gradle에 셋팅을 해줘야 한다.
내 현재 프로젝트 build.gradle은 아래와 같다.
plugins {
id 'java'
id 'org.springframework.boot' version '2.7.5'
id 'io.spring.dependency-management' version '1.1.0'
## querydsl 플러그인 방식
id 'com.ewerk.gradle.plugins.querydsl' version '1.0.10'
}
group = 'com.sample'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
def querydslVersion = '5.0.0'
configurations {
compileOnly {
extendsFrom annotationProcessor
}
## queryDSL 설정
querydsl.extendsFrom compileClasspath
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect:3.1.0'
## querydsl 디펜던시 추가
implementation 'com.querydsl:querydsl-jpa:5.0.0'
implementation 'com.querydsl:querydsl-apt:5.0.0'
##
compileOnly 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
runtimeOnly 'org.postgresql:postgresql'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
tasks.named('test') {
useJUnitPlatform()
}
## 하위 queryDSL 관련 설정
def querydslDir = "src/main/generated"
querydsl {
library = "com.querydsl:querydsl-apt"
jpa = true
querydslDefault = true
querydslSourcesDir = querydslDir
}
sourceSets {
main {
java {
srcDirs = ['src/main/java', querydslDir]
}
}
}
compileQuerydsl {
options.annotationProcessorPath = configurations.querydsl
}
자 위와 같이 추가했으면 Refresh Gradle Project 를 해주자!
문제가 없다면 querydsl 라이브러리들을 올바르게 가져온다.
이제 Gradle 을 build 한다.
(Gradle Tasks가 안보이시는 분들은 Window - show view - other - gradle 에서 선택!)
build - Run gradle Tasks 를 해주면
에러없이 성공적으로 끝났으면 Java Build Path 에서 generated 폴더를 잡아줘야 한다.
src - main - generated 를 선택해주면 이제 프로젝트 트리에서 해당 폴더가 보이며
Q클래스가 생성된 것을 볼 수 있다.
/**
* QUser is a Querydsl query type for User
*/
@Generated("com.querydsl.codegen.DefaultEntitySerializer")
public class QUser extends EntityPathBase<User> {
private static final long serialVersionUID = 1610787958L;
public static final QUser user = new QUser("user");
public final NumberPath<Integer> userAge = createNumber("userAge", Integer.class);
public final StringPath userEmail = createString("userEmail");
public final StringPath userName = createString("userName");
public QUser(String variable) {
super(User.class, forVariable(variable));
}
public QUser(Path<? extends User> path) {
super(path.getType(), path.getMetadata());
}
public QUser(PathMetadata metadata) {
super(User.class, metadata);
}
}
이제 queryDSL 구문으로 쿼리를 테스트 해보면 된다!
* 나는 Q클래스가 생성되면서 @Generated 어노테이션이 오류 나길래 보니까 import 위치가 약간 잘못 잡히는걸 발견했다.
( querydsl-codegen에 GeneratedAnnotationResolver.class 보니 자바 버전에 따라 다르다고 한다. 근데 왜 틀리게 잡는지요? ㅋㅋㅋ )
* intelliJ 에서는 이런 문제 발생하지 않음. 인텔리제이 쓰세여 ㅋㅋㅋ
import javax.annotation.processing.Generated; // 처음에 자동으로 이렇게 잡혀서 에러남
import javax.annotation.Generated; // 라이브러리 들어가서 확인해보니 processing 밖에 있어서 변경
http://querydsl.com/releases.html
'Java > JPA, QueryDSL' 카테고리의 다른 글
[QueryDSL] Q클래스, cannot find symbol error (feat.intelliJ) (0) | 2023.05.15 |
---|---|
[JPA] 복합키 연관관계 맵핑하기 (feat.@Embeddable) (0) | 2023.02.23 |
[QueryDSL] Q클래스 빌드오류 해결 (feat.intelliJ) (0) | 2023.02.16 |
[QueryDSL] Q클래스 생성하기 : annotationProcessor 방식 (feat.intelliJ) (0) | 2023.02.02 |
[JPA] Entity Table 명 대소문자 (feat.postgresql) (0) | 2022.12.29 |