querydsl단독으로 쓸 때는 아니고, spring data jpa와 같이 쓰는 경우이다.
💻 개발 환경
gradle 의존관계 보기
./gradlew dependencies --configuration compileClasspath
plugins {
id 'java'
id 'org.springframework.boot' version '3.1.0'
id 'io.spring.dependency-management' version '1.1.0'
// id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" // ⭐ Querydsl 플러그인 사용 X 추후 배포시 gradlew 할때 에러 발생
}
group = 'study'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'
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'
// ⭐1. Spring boot 3.x이상에서 QueryDsl 패키지를 정의하는 방법
// queryDsl 관련 코드생성 기능 제공
implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
// queryDsl 라이브러리
annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
tasks.named('test') {
useJUnitPlatform()
}
// 김영한강의에서는 3.x 에서는 아래 주석된 설정을 하라고 했지만 나의 경우 에러 발생하여 주석처리하고 했더니 되었다. 참고
//clean {
// delete file('src/main/generated')
//}
Gradle 콘솔 사용법
./gradlew clean compileQuerydsl
2번과 3번의 차이는
2. compileJava 는 자바소스코드(.java)파일을 자바 컴파일러를 사용하여 자바바이트코드(.class)로 컴파일링하고 3.build 전체 프로젝트를 빌드한다.
일반적으로 개발자는 build 태스크를 실행하여 전체 프로젝트를 빌드하며, compileJava 태스크는 내부적으로 자동으로 실행되므로 개발자가 직접 호출할 필요는 없습니다.
build > generated >querydsl> study.querydsl.entity.QHello.java 파일이 생성되어 있어야 함
참고: Q타입은 컴파일 시점에 자동 생성되므로 버전관리(GIT)에 포함하지 않는 것이 좋다. 앞서 설정에서 생성 위치를 gradle build 폴더 아래 생성되도록 했기 때문에 이 부분도 자연스럽게 해결된다. (대부분 gradle build 폴더를 git에 포함하지 않는다.)
public class QHello extends EntityPathBase<Hello> {
private static final long serialVersionUID = -1670026820L;
public static final QHello hello = new QHello("hello");
public final NumberPath<Long> id = this.createNumber("id", Long.class);
public QHello(String variable) {
super(Hello.class, PathMetadataFactory.forVariable(variable));
}
public QHello(Path<? extends Hello> path) {
super(path.getType(), path.getMetadata());
}
public QHello(PathMetadata metadata) {
super(Hello.class, metadata);
}
}
Test
@SpringBootTest
@Transactional
class QueryDsl3ApplicationTests {
@PersistenceContext // 스프링데이터 jpa에서 자동 빈 주입 , @Autowired 사용시 빈등록 코드를 별도로 직접 작성하여 주입해야한다.
EntityManager em;
@Test
void contextLoads() {
Hello hello = new Hello();
em.persist(hello);
JPAQueryFactory query = new JPAQueryFactory(em); QHello qHello = new QHello("hello");
Hello result = query
.selectFrom(qHello)
.fetchOne();
Assertions.assertThat(result).isEqualTo(hello); //Querydsl Q타입이 정상 동작하는가?
Assertions.assertThat(result.getId()).isEqualTo(hello.getId());//롬복 @Getter확인
}
}
💻 개발 환경
build.gradle 설정을 제외하고는 3.0 방법과 동일하다 . (2-2 ~2-4 동일)
plugins {
id 'java'
id 'org.springframework.boot' version '2.7.12'
id 'io.spring.dependency-management' version '1.0.15.RELEASE'
}
group = 'study'
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'
//Querydsl 추가
implementation 'com.querydsl:querydsl-jpa'
annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jpa"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
tasks.named('test') {
useJUnitPlatform()
}
//Querydsl 추가, 자동 생성된 Q클래스 gradle clean으로 제거
clean {
delete file('src/main/generated')
}
////querydsl 추가 시작 ( 버전 마다 안에 내용이 다를 수 있다. 구글링 요망. 김영한 강의에서는 2.x 버전에는 위의 코드는 넣지 않고 아래 주석 처리된 부분을 설정하라고 되어 있지만 나의 경우 에러발생하여 이렇게 하니깐 되었다. )
//def querydslDir = "$buildDir/generated/querydsl"
//querydsl {
// jpa = true
// querydslSourcesDir = querydslDir
//}
//sourceSets { //sourceSets 있으면 인텔리제이가 자동으로 인코드한다.
// main.java.srcDir querydslDir
//}
//configurations {
// querydsl.extendsFrom compileClasspath //컴파일
//}
//compileQuerydsl {
// options.annotationProcessorPath = configurations.querydsl // Qfile 생성해줌
//}
////querydsl 추가 끝
build > generated >querydsl> study.querydsl.entity.QHello.java 파일이 생성되어 있어야 함