프로젝트를 진행하면서 Querydsl이라는 기술이 너무 궁금했고 적용시켜보고싶어서 김영한님의 Spring Data JPA 강의에 이어 Querydsl 강의를 듣게 되었다.
이번 포스팅부터 김영한 님의 Querydsl 강의를 듣고 정리하고 프로젝트에 적용시켜보고자 한다!

최신 자바 백엔드 기술은 스프링 부트 + 스프링 데이터 JPA를 조합해서 사용한다.
그러나 이런 기술 조합으로 해결하지 못하는 한계점이 있다.
바로 복잡한 쿼리와 동적 쿼리 문제이다.
실무에서는 보통 복잡한 쿼리를 주로 다룬다. 거기에 복잡한 동적 쿼리를 생성해야할 일도 많이 있다.
우리의 비즈니스 업무에 따라서 쿼리를 작성하는 일이 전체 개발의 절반 이상인 경우도 있다. 이런 문제들을 깔끔하게 해결해주는 기술이 바로 Querydsl이다!
Querydsl은 자바 언어의 한계를 넘어서 쿼리를 문자가 아니라 진짜 자바 코드로 작성할 수 있도록 도와준다.
💡 자바 코드로 쿼리를 작성하기 때문에 문법 오류를 컴파일 시점에 잡아준다.
Querydsl이 gradle에 설정하고 gradle build 과정 속에서 "q타입이라는 파일"을 뽑아내야된다.
plugins {
id 'java'
id 'org.springframework.boot' version '3.0.6'
id 'io.spring.dependency-management' version '1.1.0'
}
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'
implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.0'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.h2database:h2'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
//Querydsl 추가
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"
}
tasks.named('test') {
useJUnitPlatform()
}
clean {
delete file('src/main/generated')
}
위 설정은 Spring Boot 3.x 기준 설정이다.
이전 버전 설정에서는 compileQuerydsl을 실행해줘야 Q파일이 생성됐지만 이 설정 같은 경우에는 main()만 실행하면 Q파일이 자동으로 만들어 진다.
💡 Q파일 같은 경우는 git에 올리면 안된다. (ignore 처리를 해주자!)
@SpringBootTest
@Transactional
class QuerydslApplicationTests {
@PersistenceContext
EntityManager em;
@Test
void contextLoads() {
Hello hello = new Hello();
em.persist(hello);
JPAQueryFactory query = new JPAQueryFactory(em);
QHello qHello = new QHello("h");
Hello result = query
.selectFrom(qHello)
.fetchOne();
assertThat(result).isEqualTo(hello);
}
}
JPAQueryFactory를 사용해야한다. 
h2.bat 실행

파일모드로 실행

이렇게 해야 DB가 생성이 된다.
TCP 모드로 접근

spring:
profiles:
active: local
datasource:
url: jdbc:h2:tcp://localhost/~/querydsl
username: sa
password:
driver-class-name: org.h2.Driver
jpa:
hibernate:
ddl-auto: create
properties:
hibernate:
# show_sql: true
format_sql: true
logging.level:
org.hibernate.SQL: debug
# org.hibernate.type: trace
Querydsl 공부를 위한 설정을 마쳤다.
다음 포스팅 부터는 Querydsl의 문법에 대해 본격적으로 진행하고자 한다.