본문 바로가기

Spring Boot

[Spring Boot] JPA QueryDSL 적용

728x90

Spring Boot에서 QueryDSL 적용하기

QueryDSL 개념

QueryDSL은 데이터베이스 쿼리를 타입 안전하고 직관적으로 작성할 수 있는 프레임워크입니다. 주요 특징은 다음과 같습니다:

  • 타입 안전성: 쿼리를 자바 코드로 작성하여 컴파일 시점에 에러를 검출할 수 있습니다.
  • 유연성: JPQL, SQL, MongoDB, Hadoop 등 다양한 데이터베이스와 연동할 수 있습니다.
  • 직관성: 메서드 체이닝을 사용하여 가독성 높은 쿼리를 작성할 수 있습니다.

 

QueryDSL 설정 방법

1. 의존성 추가

먼저 build.gradle 또는 pom.xml 파일에 QueryDSL 관련 의존성을 추가합니다.

Gradle

dependencies {
    implementation "com.querydsl:querydsl-core"
    implementation "com.querydsl:querydsl-jpa:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
    
    annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
    annotationProcessor "jakarta.persistence:jakarta.persistence-api"
    annotationProcessor "jakarta.annotation:jakarta.annotation-api"
}

 

2. 엔티티 클래스 작성

엔티티 클래스를 작성합니다. QueryDSL은 엔티티 클래스에 기반한 Q 클래스를 생성합니다.

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String email;

    // Getters and setters omitted for brevity
}

 

3. Q 클래스 생성

빌드하면 User 엔티티에 대한 Q 클래스(QUser)가 생성됩니다. Q 클래스는 쿼리 작성에 사용됩니다.

 

4. QueryDSL 사용 예제

쿼리 작성 및 실행을 위한 코드를 작성합니다. QuerydslPredicateExecutor를 사용하여 리포지토리를 정의할 수 있습니다.

import com.querydsl.core.types.dsl.BooleanExpression;
import com.querydsl.jpa.impl.JPAQueryFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;

import java.util.List;

@Service
public class UserService {

    @PersistenceContext
    private EntityManager entityManager;

    private JPAQueryFactory queryFactory;

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

    public List<User> findUsersByName(String name) {
        QUser user = QUser.user;
        BooleanExpression condition = user.name.eq(name);
        return queryFactory.selectFrom(user)
                           .where(condition)
                           .fetch();
    }
}

 

QueryDSL과 다른 ORM 비교

1. JPQL/HQL

  • 타입 안전성: JPQL/HQL은 문자열 기반으로 작성되므로 컴파일 시점에 에러를 검출할 수 없습니다. QueryDSL은 타입 안전성을 보장합니다.
  • 유연성: QueryDSL은 메서드 체이닝을 사용하여 복잡한 쿼리를 직관적으로 작성할 수 있습니다. JPQL/HQL은 문자열로 쿼리를 작성하므로 복잡한 쿼리는 가독성이 떨어질 수 있습니다.

2. Criteria API

  • 가독성: Criteria API는 자바 코드로 쿼리를 작성할 수 있지만, 코드가 길어지고 복잡해지기 쉽습니다. QueryDSL은 메서드 체이닝으로 보다 간결하고 가독성 높은 코드를 작성할 수 있습니다.
  • 타입 안전성: Criteria API와 마찬가지로 QueryDSL도 타입 안전성을 제공합니다.

3. Native SQL

  • 성능: Native SQL은 데이터베이스 고유의 쿼리를 사용할 수 있어 성능 최적화가 가능하지만, 데이터베이스 종속적입니다. QueryDSL은 데이터베이스 독립적인 쿼리를 작성할 수 있습니다.
  • 유연성: Native SQL은 모든 SQL 기능을 사용할 수 있지만, 타입 안전성과 유지보수성 측면에서 부족합니다. QueryDSL은 타입 안전성과 유지보수성을 제공합니다.

 

결론

QueryDSL은 타입 안전성, 가독성, 유지보수성을 제공하는 강력한 쿼리 언어입니다. Spring Boot와 함께 사용하면 직관적이고 효율적인 데이터베이스 쿼리를 작성할 수 있습니다. 다른 ORM 방법들과 비교했을 때, QueryDSL은 특히 복잡한 쿼리를 작성할 때 그 진가를 발휘합니다.