[java] Querydsl을 사용하여 다중 조건 검색 작업 수행하기

Querydsl은 Java로 작성된 동적 쿼리를 생성하는 데 사용되는 강력한 프레임워크입니다. 다중 조건 검색 작업은 일반적으로 데이터베이스에서 특정 조건에 맞는 레코드를 검색하는데 사용됩니다. 이번 블로그 포스트에서는 Querydsl을 사용하여 다중 조건 검색 작업을 수행하는 방법에 대해 알아보겠습니다.

1. Querydsl 설정

먼저 프로젝트의 Gradle 또는 Maven 파일에 Querydsl을 추가해야 합니다. Querydsl은 데이터베이스별로 다른 종속성을 가지므로, 사용하는 데이터베이스에 맞는 Querydsl 종속성을 추가해야 합니다.

예를 들어, PostgreSQL을 사용한다면 다음과 같이 Gradle 파일에 추가합니다.

dependencies {
    implementation 'com.querydsl:querydsl-core:4.4.0'
    implementation 'com.querydsl:querydsl-apt:4.4.0'
    implementation 'com.querydsl:querydsl-jpa:4.4.0'
    annotationProcessor 'com.querydsl:querydsl-apt:4.4.0:jpa'
}

이후, Querydsl이 적용될 JPA 엔티티를 작성합니다. 엔티티 클래스와 동일한 패키지에 Q<EntityName>.java 형식의 Querydsl 엔티티 클래스를 생성합니다. 이 클래스는 @QueryEntity 어노테이션으로 주석 처리되어야 합니다.

2. 다중 조건 검색 작업

다중 조건 검색 작업을 수행하기 위해서는 JPAQuery 클래스를 사용하여 Querydsl 쿼리를 작성해야 합니다.

다음은 예시 코드입니다.

import static com.querydsl.jpa.JPAExpressions.*;
import static com.querydsl.jpa.JPAExpressions.select;
import static com.querydsl.core.types.dsl.Expressions.*;

public List<EntityName> searchEntities(String keyword, boolean isActive) {
    QEntityName entity = QEntityName.entityName;
    
    JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);

    JPAQuery<EntityName> query = queryFactory.selectFrom(entity)
            .where(entity.name.containsIgnoreCase(keyword))
            .where(entity.isActive.eq(isActive));

    return query.fetch();
}

위 코드에서 entityName은 Querydsl 엔티티 클래스의 정적 팩토리 메서드로 생성됩니다. 그리고 queryFactory 객체를 통해 JPAQuery<EntityName> 객체를 생성합니다. 이 객체를 사용하여 다중 조건 검색 쿼리를 작성하고 원하는 결과를 가져올 수 있습니다.

where 메서드를 사용하여 다중의 조건을 추가할 수 있습니다. 위 코드에서는 name 필드가 keyword를 포함하고 isActive 필드가 isActive와 일치하는 엔티티를 가져옵니다.

마지막으로, query.fetch() 메서드를 호출하여 조회 결과를 반환합니다.

3. 실행 및 결과 확인

다중 조건 검색 작업을 실행하려면, 해당 메서드를 호출하는 곳에서 EntityManager를 주입해야 합니다. 이때, 스프링 프레임워크를 사용하는 경우 @PersistenceContext 어노테이션을 사용하여 주입할 수 있습니다.

아래는 예시 코드입니다.

@Autowired
private EntityManager entityManager;

public void executeSearch(String keyword, boolean isActive) {
    List<EntityName> entities = searchEntities(keyword, isActive);

    // 결과 출력
    for (EntityName entity : entities) {
        System.out.println(entity);
    }
}

이제 executeSearch 메서드를 호출하여 다중 조건 검색 작업을 수행하고 결과를 확인할 수 있습니다.


참고문서: