[java] Java Querydsl을 사용하여 동적 트랜잭션 쿼리 작성하기

동적인 쿼리를 작성하다보면 어떤 경우에는 트랜잭션 관련 로직을 추가해야 할 때가 있습니다. 이때 Java Querydsl을 사용하면 동적인 트랜잭션 쿼리를 손쉽게 작성할 수 있습니다. 이 글에서는 Java Querydsl을 사용하여 동적 트랜잭션 쿼리를 작성하는 방법을 알아보겠습니다.

Querydsl 설정하기

먼저, Querydsl을 사용하기 위해서는 Gradle이나 Maven과 같은 의존성 관리 도구를 사용하여 Querydsl을 프로젝트에 추가해야 합니다. Querydsl에 대한 의존성을 추가한 후에는 Q 클래스를 생성하기 위해 컴파일 타임에 Querydsl 플러그인을 실행해야 합니다. 이를 위해 build.gradle 파일에 다음과 같이 플러그인을 추가해주세요.

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

dependencies {
    implementation 'com.querydsl:querydsl-jpa:4.4.0'
    implementation 'com.querydsl:querydsl-apt:4.4.0'
}

def generated = 'src/main/generated'
querydsl {
    jpa = true
    querydslSourcesDir = generated
}

sourceSets {
    main {
        java {
            srcDir generated
        }
    }
}

compileQuerydsl {
    options.annotationProcessorPath = configurations.querydsl
}

위의 설정이 완료되면 ./gradlew compileQuerydsl 명령을 실행하여 Q 클래스를 생성할 수 있습니다.

동적 트랜잭션 쿼리 작성하기

이제 Querydsl 설정을 완료했으니 동적 트랜잭션 쿼리를 작성해보겠습니다. 예를 들어, 회원 정보를 조회하는 동적 쿼리를 작성해보겠습니다. 이때, 트랜잭션을 활용하여 조회한 회원 정보를 가지고 추가적인 작업을 수행할 수 있습니다.

@Transactional(readOnly = true)
public List<Member> searchMembers(String name, int age) {
    QMember member = QMember.member;

    JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);

    JPAQuery<Member> query = queryFactory.selectFrom(member);

    if (name != null) {
        query.where(member.name.eq(name));
    }

    if (age > 0) {
        query.where(member.age.eq(age));
    }

    List<Member> members = query.fetch();

    // 조회된 회원 정보에 대한 추가 작업 수행
    // ...

    return members;
}

위 코드에서는 Querydsl을 사용하여 동적으로 회원 정보를 조회하는 메소드인 searchMembers를 작성했습니다. 메소드의 매개변수로 이름과 나이를 받아와서 동적으로 쿼리를 작성합니다. 그리고 트랜잭션 어노테이션을 사용하여 이 메소드를 트랜잭션 내에서 실행하도록 설정합니다.

결론

Java Querydsl을 사용하면 동적인 트랜잭션 쿼리를 쉽게 작성할 수 있습니다. Querydsl의 강력한 기능을 활용하여 복잡한 동적 쿼리를 작성하고, 트랜잭션을 이용하여 조회된 데이터에 대한 추가 작업을 수행할 수 있습니다.

참고 자료