본문 바로가기

Backend

Querydsl을 이용한 동적 쿼리 작성

Querydsl은 엔티티 클래스에 해당되는 Q 도메인 클래스를 만들어서 타입 세이프한 쿼리를 작성할 수 있도록 도와주는 역할을 합니다.

타입 세이프한 쿼리라는 것은 컴파일 시점에 쿼리의 타입 불일치를 잡아낼 수 있기 때문에 런타임 에러가 발생할 확률을 줄일 수 있습니다. 또한 Q 도메인 클래스를 이용해 쿼리를 작성할 수 있으므로 가독성 향상의 효과가 있습니다. 

 

하단의 코드는 Querydsl의 Q 도메인 클래스를 활용하여 동적 쿼리문을 작성한 코드입니다. 해당 코드를 보면 확인할 수 있듯이 직접 JPQL 쿼리를 작성하는 것보다 가독성이 좋고 문제가 생길 위험도가 줄어들게 됩니다. 

default List<Product> findProductsByDynamicQuery(String nickname, Long categoryId, String productStatus, Integer startPrice, Integer endPrice, Integer maxAge, String keyword) {
        QProduct product = QProduct.product;

        BooleanBuilder builder = new BooleanBuilder();

        if (nickname != null) {
            builder.and(product.member.nickname.eq(nickname));
        }
        if (categoryId != null) {
            builder.and(product.units.any().category.categoryId.eq(categoryId));
        }
        if (productStatus != null) {
            builder.and(product.status.eq(ProductStatus.valueOf(productStatus)));
        }
        if (startPrice != null) {
            builder.and(product.totalPrice.goe(startPrice));
        }
        if (endPrice != null) {
            builder.and(product.totalPrice.loe(endPrice));
        }
        if (maxAge != null) {
            builder.and(product.maxAge.loe(maxAge));
        }
        if (keyword != null) {
            builder.and(product.title.contains(keyword));
        }

        return (List<Product>) findAll(builder);
    }

 

장점도 많지만 Querydsl은 외부 라이브러리이기 때문에 Spring boot에서 적용하기 위해서는 버전과 개발환경에 맞춰서 적용 방법이 전부 다르다는 단점도 존재합니다.