[java] Java Querydsl을 사용하여 동적 검색 기능 구현하기

이번 글에서는 Java Querydsl을 사용하여 동적 검색 기능을 구현하는 방법에 대해 알아보겠습니다. Querydsl은 JPA, SQL, MongoDB 등 다양한 데이터베이스와 ORM 프레임워크를 지원하여 효율적이고 안전한 쿼리를 만들 수 있는 도구입니다.

1. 의존성 추가하기

먼저 Maven 또는 Gradle 프로젝트에 Querydsl 의존성을 추가해야 합니다. 아래는 Maven을 사용하는 경우의 의존성 설정 예시입니다.

<!-- pom.xml -->
<dependencies>
    <dependency>
        <groupId>com.querydsl</groupId>
        <artifactId>querydsl-core</artifactId>
        <version>4.4.0</version>
    </dependency>
    <dependency>
        <groupId>com.querydsl</groupId>
        <artifactId>querydsl-jpa</artifactId>
        <version>4.4.0</version>
    </dependency>
</dependencies>

2. 엔티티 및 리포지토리 생성하기

동적 검색을 위해 검색 조건을 표현할 수 있는 DTO(Data Transfer Object) 클래스와 해당 DTO를 사용하는 리포지토리 인터페이스를 생성해야 합니다. 아래는 예시를 위해 Product 엔티티와 ProductRepository 인터페이스를 생성한 것입니다.

// Product.java
@Entity
@Table(name = "products")
public class Product {
    @Id
    private Long id;
    private String name;
    private String category;
    // ...

    // getters and setters
}

// ProductRepository.java
public interface ProductRepository extends JpaRepository<Product, Long>, QuerydslPredicateExecutor<Product> {
}

3. 동적 검색 기능 구현하기

이제 동적 검색 기능을 구현해보겠습니다. Querydsl을 사용하면 동적 검색 조건을 조합하여 쿼리를 생성할 수 있습니다.

// ProductService.java
@Service
public class ProductService {
    private final ProductRepository productRepository;
    
    @Autowired
    public ProductService(ProductRepository productRepository) {
        this.productRepository = productRepository;
    }

    public List<Product> searchProducts(String keyword, String category) {
        QProduct qProduct = QProduct.product;
        BooleanBuilder builder = new BooleanBuilder();
        
        if (keyword != null) {
            builder.and(qProduct.name.containsIgnoreCase(keyword));
        }
        
        if (category != null) {
            builder.and(qProduct.category.eq(category));
        }
        
        // 동적 검색 쿼리 실행
        return (List<Product>) productRepository.findAll(builder);
    }
}

위 코드에서는 Product 엔티티에 대한 동적 검색을 수행하는 searchProducts 메소드를 구현했습니다. QProduct는 Querydsl에서 자동 생성되는 클래스로, product.name과 같은 필드에 접근할 수 있게 해줍니다. BooleanBuilder는 여러 개의 조건을 조합할 수 있도록 해주는 빌더 클래스입니다.

4. 동적 검색 사용하기

동적 검색 기능을 사용하려면 ProductService에서 해당 메소드를 호출하면 됩니다. 아래는 검색 키워드와 카테고리를 바탕으로 상품을 검색하는 예시입니다.

// Main.java (예시)
public class Main {
    public static void main(String[] args) {
        ProductService productService = new ProductService(productRepository);
        List<Product> products = productService.searchProducts("iPhone", "Electronics");
        // 검색 결과 사용
    }
}

마치며

Java Querydsl을 사용하면 동적 검색 기능을 간편하게 구현할 수 있습니다. 이를 통해 복잡한 검색 조건을 쉽게 표현하고 안전한 쿼리를 생성할 수 있습니다. 추가적으로 Querydsl의 다양한 기능을 활용하여 더욱 효율적인 검색 기능을 구현해볼 수 있습니다.

참고 자료