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 쿼리 작성을 도와줌으로써 개발자들의 생산성을 향상시킬 수 있습니다.
참고 자료: