본문 바로가기
QueryDSL

QueryDsl 동적쿼리 작성 방법

by 이상한나라의개발자 2024. 3. 26.

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