[java] Querydsl을 사용하여 부분 일치 검색 작업 수행하기

Querydsl은 Java에서 데이터베이스에 쿼리를 생성하기 위한 도구로서 사용됩니다. 이를 통해 강력한 타입 안정성과 IDE 지원을 받으면서 쿼리 작성을 더욱 간결하게 만들 수 있습니다.

부분 일치 검색은 주어진 텍스트가 문자열의 일부분과 일치하는 데이터를 찾는 작업입니다. 이를 수행하기 위해 Querydsl에서는 like 키워드를 사용합니다. 아래의 예제를 통해 Querydsl을 사용하여 부분 일치 검색 작업을 수행하는 방법을 살펴보겠습니다.

1. Maven 또는 Gradle에 Querydsl 의존성 추가하기

먼저, 프로젝트의 빌드 도구에 Querydsl의 의존성을 추가해야 합니다. Maven을 사용하신다면 아래와 같이 pom.xml 파일에 의존성을 추가하세요.

<dependency>
  <groupId>com.querydsl</groupId>
  <artifactId>querydsl-core</artifactId>
  <version>4.4.0</version>
</dependency>

Gradle을 사용하신다면 아래와 같이 build.gradle 파일에 의존성을 추가하세요.

implementation 'com.querydsl:querydsl-core:4.4.0'

2. Querydsl 사용을 위한 설정

Querydsl을 사용하기 위해서는 코드 생성과 Q타입 클래스 생성을 위한 설정이 필요합니다. 이를 위해 아래와 같이 설정 클래스를 작성하세요.

@Configuration
public class QuerydslConfig {

  @PersistenceContext
  private EntityManager entityManager;

  @Bean
  public JPAQueryFactory jpaQueryFactory() {
    return new JPAQueryFactory(entityManager);
  }

  @Bean
  public QuerydslPredicateExecutor<?> querydslPredicateExecutor() {
    return new QuerydslPredicateExecutor<>();
  }

  @Bean
  public QuerydslBinderCustomizer<QuerydslBindings> querydslBinderCustomizer() {
    return new QuerydslBinderCustomizer<QuerydslBindings>() {
      @Override
      public void customize(QuerydslBindings bindings, EntityPath<?> root) {
        bindings.bind(String.class).first(
          (SingleValueBinding<StringPath, String>) StringExpression::containsIgnoreCase
        );
      }
    };
  }
}

위 설정 클래스는 EntityManager를 주입받아 JPAQueryFactory 빈을 생성하고, QuerydslPredicateExecutor와 QuerydslBinderCustomizer를 설정합니다. 이렇게 설정한 후에는 Querydsl을 사용할 준비가 완료됩니다.

3. Querydsl을 통한 부분 일치 검색 사용하기

이제 Querydsl을 사용하여 부분 일치 검색을 수행해볼 시간입니다. 아래는 예를 들어 User라는 엔티티에서 이름이 “John”으로 시작하는 사용자를 검색하는 코드입니다.

@Repository
public class UserRepository {

  @Autowired
  private JPAQueryFactory queryFactory;

  public List<User> searchUsersByName(String name) {
    QUser user = QUser.user;
    return queryFactory
      .selectFrom(user)
      .where(user.name.startsWithIgnoreCase(name))
      .fetch();
  }
}

위 예제에서는 Querydsl의 Q타입 클래스를 사용하여 검색을 수행하였습니다. startsWithIgnoreCase 메서드를 활용하여 이름이 특정 문자열로 시작하는지 확인하고, 해당 조건에 맞는 사용자를 검색합니다.

4. 검색 결과 사용하기

검색 결과는 List 형태로 반환되며, 이를 활용하여 원하는 작업을 수행할 수 있습니다. 예를 들어, 검색 결과를 출력하는 코드는 다음과 같습니다.

List<User> users = userRepository.searchUsersByName("John");
for (User user : users) {
  System.out.println(user.getName());
}

이렇게 하면 이름이 “John”으로 시작하는 사용자를 검색하여 출력할 수 있습니다.

결론

Querydsl을 사용하여 부분 일치 검색 작업을 수행하는 방법에 대해 알아보았습니다. Querydsl을 사용하면 강력한 타입 안정성과 함께 간결하고 가독성 높은 쿼리를 작성할 수 있습니다. 코드를 적용하고 원하는 작업에 맞게 Querydsl을 사용해 보세요!

참고 자료