QueryDSL은 타입 안전하고 동적 쿼리를 작성하기 위해 사용하는 Java 기반의 라이브러리입니다. QueryDSL은 SQL, JPA, MongoDB 등 다양한 데이터베이스와 ORM에 대해 동작하며, 코드 작성 시 컴파일 단계에서 쿼리 오류를 검출할 수 있어 안정성을 제공합니다.
QueryDSL은 메서드 체이닝을 활용해 쿼리를 작성하므로, 컴파일 단계에서 SQL이나 JPQL 쿼리의 오류를 감지할 수 있습니다.
예: 잘못된 컬럼이나 연산을 작성했을 때 컴파일 오류가 발생합니다.
BooleanBuilder와 같은 도구를 사용하여 조건에 따라 동적으로 쿼리를 생성할 수 있습니다.
여러 조건을 조합하거나 선택적으로 추가하는 데 유리합니다.
JPQL이나 Native SQL보다 직관적인 문법을 제공합니다.
쿼리가 Java 코드와 자연스럽게 통합되어 관리가 용이합니다.
JPA, SQL, MongoDB, Hibernate 등을 포함한 다양한 데이터베이스와 ORM 기술을 지원합니다.
QueryDSL은 Entity 클래스를 기반으로 Q 접두사가 붙은 클래스(QEntity)를 생성합니다. 이를 사용해 쿼리를 작성합니다.
JPQL의 한계 해결: JPQL은 동적 쿼리를 작성하는 데 불편함이 많으며, 실행 시점에 오류가 발생할 가능성이 큽니다. QueryDSL은 이를 컴파일 타임에 잡아줍니다.
복잡한 동적 쿼리 처리: 조건이 많은 동적 쿼리를 보다 쉽게 구성할 수 있습니다.
유지보수성: 쿼리를 객체로 표현하기 때문에 변경 사항을 쉽게 추적하고 수정할 수 있습니다.
dependencies {
implementation 'com.querydsl:querydsl-jpa'
annotationProcessor 'com.querydsl:querydsl-apt'
annotationProcessor 'jakarta.persistence:jakarta.persistence-api'
}
Entity 클래스를 작성한 후, annotationProcessor를 통해 Q 클래스를 생성합니다.build/generated 디렉토리 하위에 QEntity 클래스가 생성됩니다.@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String username;
private int age;
}
@Autowired
EntityManager em;
public List<User> findUsersByAge(int age) {
JPAQueryFactory queryFactory = new JPAQueryFactory(em);
QUser user = QUser.user;
return queryFactory
.selectFrom(user)
.where(user.age.eq(age))
.fetch();
}
public List<User> findUsers(String username, Integer minAge) {
JPAQueryFactory queryFactory = new JPAQueryFactory(em);
QUser user = QUser.user;
BooleanBuilder builder = new BooleanBuilder();
if (username != null) {
builder.and(user.username.eq(username));
}
if (minAge != null) {
builder.and(user.age.goe(minAge));
}
return queryFactory
.selectFrom(user)
.where(builder)
.fetch();
}

복잡한 동적 쿼리가 필요한 경우
예: 검색 조건이 많거나, 조건이 자주 변경되는 애플리케이션.
쿼리 오류를 컴파일 타임에 잡아야 하는 경우
예: 대규모 프로젝트에서 안정성을 높이기 위해.
다양한 데이터베이스와 통합이 필요한 경우
SQL, MongoDB 등에서 QueryDSL 사용.
QueryDSL은 타입 안전성과 동적 쿼리 생성을 모두 만족시킬 수 있는 강력한 도구로, 특히 JPA 기반의 프로젝트에서 매우 유용하게 사용됩니다.