[java] Querydsl을 사용하여 데이터베이스 쿼리 결과 매핑하기

Querydsl은 Java 기반의 데이터베이스 쿼리 빌더이며, SQL문을 Java 코드로 타입 세이프하게 작성할 수 있도록 도와줍니다. 이번 포스트에서는 Querydsl을 사용하여 데이터베이스 쿼리 결과를 매핑하는 방법에 대해 알아보겠습니다.

필수 의존성 추가하기

먼저, Querydsl을 사용하기 위해서는 Maven 또는 Gradle 프로젝트에 다음 의존성을 추가해야 합니다. (혹은 해당하는 빌드 관리 도구의 의존성 선언 방식을 따르세요)

<dependency>
    <groupId>com.querydsl</groupId>
    <artifactId>querydsl-core</artifactId>
    <version>${querydsl.version}</version>
</dependency>
<dependency>
    <groupId>com.querydsl</groupId>
    <artifactId>querydsl-jpa</artifactId>
    <version>${querydsl.version}</version>
</dependency>

${querydsl.version}을 사용하여 원하는 Querydsl 버전을 선택할 수 있습니다.

엔티티와 Q클래스 생성하기

Querydsl을 사용하기 위해 엔티티와 Q클래스를 생성해야 합니다. Q클래스는 엔티티의 필드를 참조할 수 있는 정적 필드를 제공합니다. 다음과 같이 Q 접두사를 가진 Q클래스를 생성합니다.

package com.example.entity;

import com.querydsl.core.types.dsl.*;

import javax.annotation.Generated;

/**
 * QEntity는 엔티티의 필드를 참조할 수 있는 정적 필드를 제공한다.
 */
@Generated("com.querydsl.codegen.EntitySerializer")
public class QEntity extends EntityPathBase<Entity> {
    // 필드 정의
    public final StringPath name = createString("name");
    public final NumberPath<Integer> age = createNumber("age", Integer.class);

    // 생성자
    public QEntity(String variable) {
        super(Entity.class, forVariable(variable));
    }
}

위 코드에서 Entity는 데이터베이스 테이블과 매핑되는 클래스입니다.

쿼리 작성하기

Querydsl을 사용하여 데이터베이스 쿼리를 작성하려면 JPAQueryFactory 객체를 생성해야 합니다. 아래는 JPA를 사용하는 경우의 예시입니다.

package com.example.repository;

import com.example.entity.QEntity;
import com.querydsl.jpa.impl.JPAQueryFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import javax.persistence.EntityManager;

@Repository
public class EntityRepository {

    private final JPAQueryFactory queryFactory;

    @Autowired
    public EntityRepository(EntityManager entityManager) {
        this.queryFactory = new JPAQueryFactory(entityManager);
    }

    public List<Entity> getEntitiesByName(String name) {
        QEntity qEntity = QEntity.entity;
        return queryFactory.selectFrom(qEntity)
                .where(qEntity.name.eq(name))
                .fetch();
    }
}

위 코드는 EntityRepository 클래스에서 Querydsl을 사용하여 name이 주어진 엔티티를 조회하는 예시입니다.

결과 매핑하기

Querydsl을 사용하면 쿼리 결과를 엔티티 객체에 매핑할 수 있습니다. 예를 들어, getEntitiesByName 메소드의 결과는 List<Entity> 객체로 반환됩니다.

List<Entity> entities = entityRepository.getEntitiesByName("John");

위 코드에서 entities는 쿼리 결과로 매핑된 Entity 객체의 리스트입니다.

Querydsl을 사용하여 데이터베이스 쿼리 결과를 매핑하는 방법을 알아보았습니다. Querydsl은 타입 세이프한 쿼리 작성과 결과 매핑을 통해 생산성을 높여줍니다.

더 자세한 내용은 Querydsl 공식 문서를 참조하세요.

출처: freecodecamp