[java] Java Querydsl을 사용하여 데이터베이스 연산 수행하기

Java Querydsl은 Java 언어로 작성된 SQL 쿼리를 타입 안정성이 보장되는 형태로 작성할 수 있게 해주는 라이브러리입니다. Querydsl은 데이터베이스 연산을 수행하기 위한 Fluent API를 제공하여 코드 가독성을 높이고 개발자 실수를 방지할 수 있습니다.

Querydsl 설정하기

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

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

Querydsl을 사용하기 위해 JPA를 함께 사용하므로, JPA 의존성도 함께 추가해주어야 합니다.

쿼리 작성하기

Querydsl을 사용하여 데이터베이스 연산을 수행하려면 쿼리 타입 및 엔티티 클래스를 생성해야 합니다. Querydsl은 JPA 엔티티들을 기반으로 동적으로 쿼리를 작성할 수 있도록 도와줍니다.

먼저, Q 접두사가 붙은 Querydsl 쿼리 타입 클래스를 생성합니다. 예를 들어, User 엔티티에 대한 쿼리를 작성한다면 QUser 클래스를 생성해야 합니다. Querydsl 쿼리 타입 클래스는 Q 접두사와 엔티티 클래스의 이름을 조합하여 생성됩니다.

다음은 User 엔티티에 대한 UserRepository 인터페이스와 QUser 쿼리 타입 클래스의 예입니다.

public interface UserRepository extends JpaRepository<User, Long> {
    List<User> findByFirstName(String firstName);
}

public class QUser extends EntityPathBase<User> {
    public static final QUser user = new QUser("user");

    public final StringPath firstName = createString("firstName");
    public final StringPath lastName = createString("lastName");
    public final DatePath<Date> birthday = createDate("birthday", Date.class);

    public QUser(String variable) {
        super(User.class, variable);
    }
}

위 코드에서 QUser 클래스는 User 엔티티의 속성들을 나타내는 필드들을 가지고 있습니다.

쿼리 실행하기

이제 Querydsl을 사용하여 실제 데이터베이스 연산을 수행할 수 있습니다. UserRepository를 이용하여 Querydsl 쿼리를 실행하는 예제를 살펴보겠습니다.

@Repository
public class UserRepositoryImpl implements UserRepositoryCustom {

    @PersistenceContext
    private EntityManager entityManager;

    @Override
    public List<User> findByFirstNameAndLastName(String firstName, String lastName) {
        JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);

        QUser qUser = QUser.user;
        return queryFactory.selectFrom(qUser)
                .where(qUser.firstName.eq(firstName)
                        .and(qUser.lastName.eq(lastName)))
                .fetch();
    }
}

위 코드에서는 JPAQueryFactory 클래스를 사용하여 QUser 클래스와 데이터베이스 연결을 통해 쿼리를 실행합니다. where 절에서는 QUser 클래스의 필드들을 이용하여 쿼리를 작성할 수 있습니다.

결론

Java Querydsl을 사용하면 타입 안정성이 보장되는 형태로 데이터베이스 연산을 수행할 수 있습니다. Querydsl은 코드 가독성을 높이고 개발자 실수를 방지하여 개발 생산성을 향상시킬 수 있습니다.