스프링부트 2.6부터는 Querydsl 5.0을 사용한다고 한다!
아래와 같이build.gralde에 작성해주었다.
buildscript {
ext {
queryDslVersion = "5.0.0"
}
}
plugins {
id 'java'
id 'org.springframework.boot' version '2.7.6'
id 'io.spring.dependency-management' version '1.0.15.RELEASE'
//querydsl 추가
id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
}
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'
testImplementation 'org.projectlombok:lombok:1.18.22'
compileOnly 'org.projectlombok:lombok'
//querydsl 추가
implementation "com.querydsl:querydsl-jpa:${queryDslVersion}"
annotationProcessor "com.querydsl:querydsl-apt:${queryDslVersion}"
runtimeOnly 'com.h2database:h2'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
tasks.named('test') {
useJUnitPlatform()
}
//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 추가 끝
main/java/study/querydsl/entity 패키지 안에 Hello.class 생성
@Entity
@Getter @Setter
public class Hello {
@Id @GeneratedValue
private Long id;
}
오른쪽 Gradle탭 - Task/other/compileQuerydsl 클릭

build.gradle에서 querydslDir을 보면 build/generated/querydsl로 설정
-> 해당 폴더 sources root로 설정!

compileQuerydsl 클릭하면 build/generated/querydsl (= sources root) 아래 main/java 하위에 생성한 Hello 클래스의 위치와 같은 패키지의 장소에 QHello가 생성된다.
build process에 comileQuerydsl이 들어있어서 build해도 Q파일 생성된다.
Hello.java가 있는 패키지와 같은 위치의 패키지에 QHello.java가 생겼다.

cmd 창에서 해당 프로젝트 최상단에서 gradlew clean하면 build 파일 사라지면서 생성된 Q 파일도 날라간다.
cmd 창에서 해당 프로젝트 최상단에서 gradlew compileQuerydsl 실행
다시 build 파일과 Q파일들이 생성된다.
gradlew compileJava 해도 똑같이 생성된다.
시스템이 자동으로 생성해주는 파일들이라서, 라이브러리 버전이 올라감에 따라서 세부적인 사항들이 변경될 수 있다.
git에서 관리하면 버전 향상에 따른 변경 사항까지 commit 해야한다.
build폴더는 보통 gradle에서 자동으로 ignore
-> 따라서 별도의 gitignore 처리 필요 없음
단, src 아래에 생성하거나 하면 gitignore 설정 필요
spring initializr가 기본적으로 만들어준 Test파일 속 contextLoads에 Test 작성했다.
@SpringBootTest
@Transactional
class QuerydslApplicationTests {
@Autowired
EntityManager em;
// 참고: spring 표준 스펙에서는 @Autowired 대신 @PersistenceContext 사용, spring 최신버전에서는 @Autowired 사용 가능
@Test
void contextLoads() {
Hello hello = new Hello();
em.persist(hello); // hello 엔티티 저장
JPAQueryFactory query = new JPAQueryFactory(em);// querydsl 사용을 위해 JPAQueryFactory 생성
QHello qHello = new QHello("h");// alias(별칭) 설정
/*
QHello qHello = new QHello("h");를
다음과 같이 사용도 가능: QHello qHello = QHello.hello;
만들어진 QHello를 보면 static final로 hello라고 자기 자신을 만들어서 필드로 선언해놓음
*/
// querydsl사용 - 내 생각) em.find(hello)랑 같은건데 querydsl을 사용한 버전인 듯
Hello result = query
.selectFrom(qHello) // querydsl을 쓸 때, query와 관련된것은 Q타입을 넣어야함
.fetchOne();
assertThat(result).isEqualTo(hello);// querydsl 동작 확인
assertThat(result.getId()).isEqualTo(hello.getId());// 롬복 동작 확인
}
}

테스트에서는 테스트 종료 후 자동 롤백 시켜서 쿼리 날라가는 쿼리문이 콘솔에 나오지 않는다.
-> @Commit을 사용하면 테스트 종료 후, 롤백하지 않는다!
참고: 스프링 부트에 아무런 설정도 하지 않으면 h2 DB를 메모리 모드로 JVM안에서 실행한다.