[java] Java Querydsl을 사용하여 정적 쿼리 작성하기

Java Querydsl은 Java 언어를 사용하여 정적 쿼리를 작성하고 실행하는 데 도움을 주는 오픈 소스 라이브러리입니다. 이를 사용하면 SQL 쿼리를 문자열로 작성하는 대신 Java 코드로 작성하여 런타임에 오류를 잡을 수 있으며, IDE의 자동 완성 및 타입 체크 기능을 활용할 수 있습니다.

Querydsl을 사용하여 정적 쿼리를 작성하는 방법은 다음과 같습니다.

1. Querydsl Maven 종속성 추가

먼저, Maven 프로젝트의 pom.xml 파일에 Querydsl 종속성을 추가해야 합니다.

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

2. Querydsl Q 클래스 생성

Querydsl은 코드 생성 도구를 제공하여 쿼리에 사용할 도메인 클래스에 대한 Q 클래스를 생성합니다. 이를 위해 다음과 같은 Maven 플러그인을 추가해야 합니다.

<plugin>
    <groupId>com.mysema.maven</groupId>
    <artifactId>apt-maven-plugin</artifactId>
    <version>1.1.3</version>
    <executions>
        <execution>
            <goals>
                <goal>process</goal>
            </goals>
            <configuration>
                <outputDirectory>target/generated-sources/java</outputDirectory>
                <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
            </configuration>
        </execution>
    </executions>
</plugin>

이후, Maven을 사용하여 프로젝트를 빌드하면 Q 클래스가 target/generated-sources/java 디렉토리에 생성됩니다.

3. 쿼리 작성 및 실행

Q 클래스가 생성되면 해당 도메인 클래스를 기반으로 정적 쿼리를 작성할 수 있습니다. 일반적으로는 JPAQuerySQLQuery와 같은 쿼리 객체를 사용하여 쿼리를 작성하고 실행합니다.

QUser qUser = QUser.user;
JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);

List<User> users = queryFactory
    .selectFrom(qUser)
    .where(qUser.age.gt(20))
    .orderBy(qUser.name.asc())
    .fetch();

위의 예제는 User 엔티티에서 나이가 20살 이상인 사용자를 이름순으로 정렬하여 조회하는 쿼리입니다.

4. IDE의 자동 완성 및 타입 체크 기능 활용

Querydsl을 사용하면 IDE에서 자동 완성과 타입 체크를 활용할 수 있습니다. Q 클래스를 사용하면 쿼리에서 사용 가능한 속성과 메서드를 자동으로 추천해주고, 잘못된 속성이나 메서드를 사용했을 때 컴파일 시점에서 오류를 발견할 수 있습니다.

결론

Java Querydsl을 사용하여 정적 쿼리를 작성하면 런타임 오류를 줄이고 생산성을 향상시킬 수 있습니다. IDE의 자동 완성과 타입 체크 기능을 활용하여 빠른 개발이 가능하며, 코드의 가독성과 유지 보수성도 향상시킬 수 있습니다.

참고 자료: