[java] Querydsl과 JPA의 결합 사용하기

개요

Querydsl은 Java에서 사용할 수 있는 강력한 쿼리 빌더 라이브러리입니다. JPA(Java Persistence API)는 Java에서 객체-관계 매핑을 위한 표준 인터페이스를 제공합니다. Querydsl과 JPA를 함께 사용하면 직관적이고 유연한 쿼리 작성과 객체 지향적인 데이터 처리를 할 수 있습니다.

이번 포스트에서는 Querydsl을 사용하여 JPA와 결합하여 데이터베이스에서 데이터를 조회하는 방법에 대해 알아보겠습니다.

의존성 설정

Querydsl과 JPA를 함께 사용하기 위해서는 먼저 적절한 의존성을 설정해야 합니다.

Maven을 사용하는 경우 pom.xml 파일에 다음 의존성을 추가해주세요:

<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>

Gradle을 사용하는 경우 build.gradle 파일에 다음 의존성을 추가해주세요:

implementation 'com.querydsl:querydsl-core:5.0.0'
implementation 'com.querydsl:querydsl-jpa:5.0.0'

Querydsl 쿼리 작성하기

Querydsl을 사용하여 JPA의 엔티티를 대상으로 데이터베이스에서 조회하기 위해서는 다음과 같은 단계를 거쳐야 합니다.

  1. QueryDSL Q 클래스 생성하기
  2. EntityManager 설정하기
  3. QuerydslRepositorySupport 클래스를 상속한 Repository 생성하기
  4. 쿼리 작성하기

1. QueryDSL Q 클래스 생성하기

Querydsl은 QueryDSL Q 클래스를 생성하여 엔티티의 속성에 접근하고 쿼리를 작성하는데 사용됩니다.

Q 클래스는 maven 또는 gradle의 플러그인을 사용하거나 직접 생성할 수 있습니다.

아래와 같은 코드로 Q 클래스를 생성할 수 있습니다:

package com.example.entity;

import com.querydsl.core.types.EntityPath;
import com.querydsl.core.types.dsl.EntityPathBase;
import com.querydsl.core.types.dsl.PathBuilder;
import javax.annotation.Generated;

import static com.querydsl.core.types.PathMetadataFactory.forVariable;

/**
 * QEntity는 QueryDSL을 사용하여 쿼리를 작성하기 위한 Q 클래스입니다.
 * 이 클래스는 직접 수정하지 마세요.
 */
@Generated("com.querydsl.codegen.EntitySerializer")
public class QEntity extends EntityPathBase<Entity> {

    public QEntity(String variable) {
        super(Entity.class, forVariable(variable));
    }

    public QEntity(Path<? extends Entity> path) {
        super(path.getType(), path.getMetadata());
    }

    public QEntity(PathMetadata metadata) {
        super(Entity.class, metadata);
    }

    public final StringPath name = createString("name");
}

2. EntityManager 설정하기

EntityManager는 JPA와 데이터베이스를 연결하여 데이터를 조회하고 조작하는 역할을 합니다. EntityManager를 설정하기 위해서는 persistence.xml 파일에 DataSource와 JPA 관련 설정을 추가해야 합니다.

3. QuerydslRepositorySupport 클래스를 상속한 Repository 생성하기

QuerydslRepositorySupport 클래스를 상속하여 Repository를 생성합니다. 이 클래스를 상속하면 Querydsl을 사용하여 JPA 엔티티에 대한 쿼리 작성을 지원받을 수 있습니다.

package com.example.repository;

@Repository
public class EntityRepository extends QuerydslRepositorySupport {

    private final EntityManager entityManager;

    public EntityRepository(EntityManager entityManager) {
        super(Entity.class);
        this.entityManager = entityManager;
    }

    public List<Entity> findEntitiesWithName(String name) {
        QEntity entity = QEntity.entity;
        return from(entity)
            .where(entity.name.eq(name))
            .fetch();
    }
}

4. 쿼리 작성하기

Repository에서 사용할 쿼리를 작성합니다. Querydsl을 사용하여 JPA 엔티티에 대한 쿼리를 작성할 수 있습니다. 예를 들어, findEntitiesWithName 메서드는 name 속성이 주어진 값과 일치하는 엔티티를 조회합니다.

쿼리 작성이 끝나면 해당 메서드를 호출하여 데이터를 조회할 수 있습니다.

@Service
public class EntityService {

    private final EntityRepository entityRepository;

    public EntityService(EntityRepository entityRepository) {
        this.entityRepository = entityRepository;
    }

    public List<Entity> findEntitiesWithName(String name) {
        return entityRepository.findEntitiesWithName(name);
    }
}

결론

Querydsl과 JPA를 함께 사용하여 데이터베이스에서 데이터를 조회하는 방법에 대해 알아보았습니다. Querydsl을 사용하면 JPA 엔티티에 대한 직관적이고 유연한 쿼리 작성이 가능하며, 객체 지향적인 데이터 처리를 할 수 있습니다.