[java] Java Querydsl을 사용하여 데이터베이스 테이블의 데이터 변환하기

목차

개요

Querydsl은 Java에서 동적 SQL 쿼리 작성을 지원하는 오픈 소스 라이브러리입니다. 이를 사용하면 Java 코드로 SQL 쿼리를 작성하고, 동적으로 조건을 추가하거나 정렬을 변경할 수 있습니다. 이번 블로그 포스트에서는 Querydsl을 사용하여 데이터베이스 테이블의 데이터를 조회하고, 원하는 형태로 변환하는 방법에 대해 알아보겠습니다.

Querydsl 설정하기

먼저, 프로젝트에 Querydsl을 설정해야 합니다. 이를 위해 다음과 같이 Gradle에 Querydsl 관련 의존성을 추가합니다.

plugins {
    id 'com.ewerk.gradle.plugins.querydsl' version '1.0.10'
}

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

그런 다음, Querydsl 관련 설정을 위한 클래스를 생성합니다. 이 클래스에서는 Querydsl의 JPAQueryFactory를 빈으로 등록하고, EntityManager를 주입받아 사용합니다.

@Configuration
public class QuerydslConfig {

    @PersistenceContext
    private EntityManager entityManager;

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

쿼리 작성하기

이제 Querydsl을 사용하여 데이터베이스 테이블의 데이터를 조회하기 위해 쿼리를 작성해보겠습니다. 예를 들어, User 테이블에서 이름이 “John”인 사용자를 조회하는 쿼리를 작성해보겠습니다.

@Repository
public class UserRepository {

    private final JPAQueryFactory queryFactory;

    public UserRepository(JPAQueryFactory queryFactory) {
        this.queryFactory = queryFactory;
    }

    public User findByName(String name) {
        QUser user = QUser.user;
        return queryFactory.selectFrom(user)
                .where(user.name.eq(name))
                .fetchOne();
    }
}

위의 예제에서는 Querydsl의 QUser 클래스를 사용하여 쿼리 작성을 시작합니다. QUser는 데이터베이스의 User 테이블과 매핑되는 엔티티 클래스입니다. selectFrom() 메서드를 사용하여 조회할 테이블을 지정하고, where() 메서드를 사용하여 조건을 추가합니다. fetchOne() 메서드를 호출하면 결과를 가져올 수 있습니다.

결과 데이터 변환하기

위의 예제에서는 User 테이블의 데이터를 조회한 후, 이를 User 객체로 변환하여 반환하고 있습니다. 이러한 결과 데이터의 변환이 필요한 경우, 다음과 같은 방법을 사용할 수 있습니다.

@Repository
public class UserRepository {

    private final JPAQueryFactory queryFactory;

    public UserRepository(JPAQueryFactory queryFactory) {
        this.queryFactory = queryFactory;
    }

    public List<String> findNamesByAgeGreaterThan(int age) {
        QUser user = QUser.user;
        List<User> users = queryFactory.selectFrom(user)
                .where(user.age.gt(age))
                .fetch();

        return users.stream()
                .map(User::getName)
                .collect(Collectors.toList());
    }
}

위의 예제에서는 User 테이블에서 나이가 age보다 큰 사용자들을 조회한 후, 각 사용자의 이름만 반환하고 있습니다. fetch() 메서드를 사용하여 결과 데이터를 가져온 후, Java Stream을 이용하여 원하는 형태로 데이터를 변환합니다.

참고 자료