Hibernate Query Language의 쿼리를 타입에 안전하게 생성 및 관리해주는 프레임워크로, 정적인 타입을 이용하여 SQL 같은 쿼리를 생성할 수 있게 해줌. 자바의 백엔드는 Spring Boot + Spring Data JPA를 함께 사용하는데, 복잡한 쿼리, 동적 쿼리를 구현하는데 한계가 있는데, 이걸 해결하는 것이 QueryDSL임.
QueryDSL 이전에는 Mybatis, JPQL 등 문자열 형태로 쿼리문을 작성하여 컴파일 시 오류 발견이 불가능했음
List<Member> result = queryFactory
.select(member)
.from(member)
.where(usernameEq("yeeunhong"))
.fetch();
buildscript {
ext {
queryDslVersion = "5.0.0"
}
}
plugins {
id 'java'
id 'org.springframework.boot' version '3.0.2'
id 'io.spring.dependency-management' version '1.1.0'
id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
}
group = 'me.yeeunhong'
version = '1.0-SNAPSHOT'
sourceCompatibility = '17'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa' // 스프링 데이터 JPA
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' // 타임리프
implementation 'org.springframework.boot:spring-boot-starter-validation' // validation
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0' // swagger
implementation("com.querydsl:querydsl-core:${queryDslVersion}")
implementation("com.querydsl:querydsl-jpa:${queryDslVersion}:jakarta")
runtimeOnly 'com.h2database:h2' // 인메모리 데이터베이스
compileOnly 'org.projectlombok:lombok' // 롬복
annotationProcessor (
'org.projectlombok:lombok',
"com.querydsl:querydsl-apt:${queryDslVersion}:jakarta",
"jakarta.persistence:jakarta.persistence-api:3.1.0"
)
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
/*
* queryDSL 설정 추가
*/
def querydslDir = "$buildDir/generated/querydsl"
querydsl {
jpa = true
querydslSourcesDir = querydslDir
}
sourceSets {
main.java.srcDir querydslDir
}
compileQuerydsl {
options.annotationProcessorPath = configurations.querydsl
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
querydsl.extendsFrom compileClasspath
}
test {
useJUnitPlatform()
}

클릭 시 'QArticle'이라는 클래스가 생성됨

QueryDslConfig 클래스 만들기

repository package 내 아래 파일 만들기

BlogRepositoryCustom
package me.yeeunhong.blogproject.repository;
import me.yeeunhong.blogproject.domain.Article;
import java.util.List;
public interface BlogRepositoryCustom {
List<Article> findByTitle(String title);
}
BlogRepositoryImpl
package me.yeeunhong.blogproject.repository;
import com.querydsl.jpa.impl.JPAQueryFactory;
import lombok.RequiredArgsConstructor;
import me.yeeunhong.blogproject.domain.Article;
import java.util.List;
import static me.yeeunhong.blogproject.domain.QArticle.article;
@RequiredArgsConstructor
public class BlogRepositoryImpl implements BlogRepositoryCustom {
private final JPAQueryFactory queryFactory;
@Override
public List<Article> findByTitle(String title) {
return queryFactory.selectFrom(article)
.where(article.title.eq(title))
.fetch();
}
}
BlogRepository

https://velog.io/@cws0718/Spring-JPA-QueryDsl%EC%9D%B4%EB%9E%80