
QueryDSL을 알아보기 전에 Spring Data JPA대해서 먼저 알아보자!!
JPA는 Java 오프젝트를 관계형 데이터베이스에 매핑하는 Java 표준이다.
JPA는 개발자가 데이터베이스에 데이터를 CRUD(Create, Read, Update, Delete)를 위해 SQL을 작성할 필요없이 객체를 조작하는 것만으로 데이터베이스에 CRUD 수행할 수 있게 해준다.
대표적인 JPA 기반 구현체로 Hibernate가 있다.
Spring Data JPA는 JPA를 더 쉽게 사용할 수 있도록 도와주는 모듈이다.
Spring Data JPA는 JPA 기반의 Repository들을 쉽게 구현할 수 있도록 인터페이스들을 제공한다.
Spring Data JPA에서 제공하는 JPARepository와 같은 인터페이스를 상속받아 새로운 Repository 인터페이스를 생성하고, 정해진 규칙대로 메소드명을 명명하면 Spring Data JPA가 자동으로 코드를 생성한다.
public interface TodoRepository extends JpaRepository<Todo, Long>,TodoQueryRepository{
}
type-safe(컴파일시 에러 체크 가능) 한 동적 쿼리를 직관적으로 작성할 수 있게 도와주는 Java 기반 쿼리 라이브러리
QueryDSL은 정적 타입을 이용해서 SQL과 같은 쿼리를 생성할 수 있도록 해 주는 오픈소스 프레임워크이다.
build.gradle
dependencies {
// querydsl
implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"
}
QueryDslConfig
EntityManager를 JPAQueryFactory 에 주입을 하여 jpaQueryFactory Bean을 생성한다.@Configuration
class QueryDslConfig {
@PersistenceContext
private EntityManager em;
@Bean
public JPAQueryFactory jpaQueryFactory() {
return new JPAQueryFactory(JPQLTemplates.DEFAULT, em);
}
}
QClass

QClass란?
BooleanExpression(TodoQueryRepositoryImpl)
@Repository
@RequiredArgsConstructor
public class TodoQueryRepositoryImpl implements TodoQueryRepository {
private final JPAQueryFactory jpaQueryFactory;
@Override
public Todo findByIdByDsl(long todoId) {
return jpaQueryFactory
.select(todo)
.from(todo)
.leftJoin(todo.user).fetchJoin()
.where(
todoIdEq(todoId)
).fetchOne();
}
private BooleanExpression todoIdEq(Long todoId) {
return todoId != null ? todo.id.eq(todoId) : null;
}
}
https://medium.com/mo-zza/spring-data-jpa-querydsl-%EC%A0%81%EC%9A%A9-22a0364cd579