QueryDsl은 자바 개발자들 사이에서 꾸준히 인기를 끌고 있는 라이브러리 중 하나입니다. SQL, JPA 등 다양한 쿼리의 타입 안전성을 보장하며 Java 코드로 직접 작성할 수 있게 도와줍니다. 이 글에서는 QueryDsl의 강력한 기능 중 하나인 동적 쿼리 작성 방법에 대해서 알아봅니다. 동적 쿼리는 어플리케이션 실행 중에 쿼리 조건이 결정되는 경우에 매우 유용합니다. 예를 들어, 사용자의 입력 값에 따라 검색 조건이 바뀌어야 할 때 이를 쉽게 처리할 수 있습니다.
동적 쿼리란?
동적 쿼리는 실행 시점에 어떤 조건을 쿼리에 포함할지 결정하는 쿼리 입니다. 예를 들어, 검색 폼에 여러 조건을 입력하고, 이 중 일부만 선택적으로 적용하여 결과를 필터링해야 하는 상황이 있다면, 동적 쿼리가 필요하게 됩니다.
QueryDsl에서 동적 쿼리 작성 방법
QueryDsl에서 동적 쿼리를 구현하는 주요 방법은 두 가지입니다. 첫 번째 "BooleanBuilder"를 활용하는 방법이고, 두 번째 "where" 절에 직접 조건을 추가하는 방법입니다.
BooleanBuilder를 사용한 동적 쿼리
BooleanBuilder는 조건을 동적으로 구축할 수 있는 유연성을 제공합니다. 아래는 BooleanBuilder를 사용한 예시입니다.
@Test
void 동적_쿼리_예시_BooleanBuilder() {
String title = "";
BooleanBuilder booleanBuilder = new BooleanBuilder();
if ( StringUtils.hasText(title)) {
booleanBuilder.and(book.title.eq(title));
}
List<Book> result = queryFactory
.select(book)
.from(book)
.where(booleanBuilder)
.fetch();
System.out.println("result = " + result);
}
이 예시에서 사용자로 부터 전달 받은 책 제목을 검사하여, 해당 값이 null이 아닐 경우에만 조건을 쿼리에 추가합니다.
where 조건에 사용
QueryDsl은 where 조건에 null을 무시하는 특성을 이용하여, 조건이 null일 경우 해당 조건을 쿼리에서 제외하는 방법을 이용할 수 있습니다.
@Test
void 동적_쿼리_예시_where() {
String title = null;
List<Book> result = queryFactory
.select(book)
.from(book)
.where(
titleEq(title)
)
.fetch();
System.out.println("result = " + result);
}
private BooleanExpression titleEq(String title) {
if (StringUtils.hasText(title)) {
return book.title.eq(title);
}
return null;
}
이 방식은 조건을 검사하는 titleEq 메서드를 별도로 정의하고 이 메서드들이 조건이 충족되지 않을 때 null을 반환하도록 함으로써, 필요한 조건만 쿼리에 포함 시키게 됩니다.
'QueryDSL' 카테고리의 다른 글
QueryDsl 페이징 처리 (0) | 2024.04.01 |
---|---|
QueryDsl에서 함수 사용 (0) | 2024.03.27 |
QueryDsl 프로젝션 결과 반환 (0) | 2024.03.25 |
QueryDsl 서브쿼리 (0) | 2024.03.20 |
QueryDsl 조인 (0) | 2024.03.20 |