[java] Java Querydsl을 사용하여 동적 컬럼 선언하기

Java Querydsl은 SQL 쿼리를 타입 안전하게 작성할 수 있는 라이브러리입니다. 이 라이브러리를 사용하여 동적으로 컬럼을 선언하는 방법을 알아보겠습니다.

1. 의존성 추가하기

먼저, 프로젝트에 Querydsl의 의존성을 추가해야 합니다. Maven을 사용하는 경우, pom.xml 파일에 다음 의존성을 추가하세요.

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

Gradle을 사용하는 경우, build.gradle 파일에 다음 의존성을 추가하세요.

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

의존성을 추가한 후에는 프로젝트를 업데이트하여 라이브러리를 다운로드 받아야 합니다.

2. 동적 컬럼 선언하기

Querydsl을 사용하여 동적으로 컬럼을 선언하려면, Q 클래스를 사용해야 합니다. Q 클래스는 QueryDSL이 코드 생성기를 통해 생성된 클래스로, 사용하려는 도메인 객체의 필드와 연결되어 있습니다.

먼저, 도메인 클래스를 작성합니다. 예를 들어, 다음과 같은 도메인 클래스가 있다고 가정합시다.

public class Product {
    private Long id;
    private String name;
    private BigDecimal price;
    // getter, setter, 생성자 등 생략
}

다음으로, Querydsl 코드 생성기를 이용하여 Q 클래스를 자동으로 생성합니다. Q 클래스는 컴파일 시점에 생성되므로, 프로젝트를 빌드해야 합니다.

Q 클래스가 생성되었다면, 이를 사용하여 동적으로 컬럼을 선언할 수 있습니다. 예를 들어, name 필드 기준으로 동적으로 컬럼을 선언하려면 다음과 같이 코드를 작성합니다.

QProduct qProduct = QProduct.product;
JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);

String columnName = "name";
Expression<String> columnExpr = new CaseBuilder()
    .when(qProduct.name.isNull()).then("")
    .otherwise(qProduct.name)
    .as(columnName);

List<String> results = queryFactory.select(columnExpr)
    .from(qProduct)
    .fetch();

results.forEach(System.out::println);

위 코드에서는 QProduct 클래스를 사용하여 QProduct.product 인스턴스를 생성하였습니다. 그리고, JPAQueryFactory 클래스를 사용하여 쿼리를 생성합니다.

CaseBuilder를 사용하여 동적으로 컬럼을 선언하고, select 메소드를 통해 쿼리 결과를 조회합니다. 이렇게 조회한 결과는 List<String> 형태로 반환되며, 결과를 원하는 대로 처리할 수 있습니다.

결론

Java Querydsl을 사용하여 동적으로 컬럼을 선언하는 방법에 대해 알아보았습니다. Querydsl을 사용하면 타입 안전한 SQL 쿼리 작성을 도와줌으로써 개발자들의 생산성을 향상시킬 수 있습니다.

참고 자료: