ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SpringBoot] QueryDSL 사용법 + 환경설정
    Spring(Java) 2024. 1. 31. 15:00

    Querydsl

     

    Querydsl 정적 타입을 이용해서 SQL과 같은 쿼리를 생성할 수 있도록 해주는 프레임워크


    배경

    • HQL 쿼리를 더 안전하게 실행하기 위한 목적으로 만들어졌다.
    • HQL 쿼리를 작성하다보면 String 연결을 이용하고, 읽기 어려운 코드가 만들어진다.
    • String을 이용해 도메인 타입과 프로퍼티를 참조하다보면 오타 등으로 잘못된 참조를 할 수 있다.

    장점

    • Querydsl이 제공하는 Fluent API를 이용 가능
      • IDE의 코드 자동완성 기능 사용 가능
      • 문법적으로 잘못된 쿼리를 허용하지 않음
      • 도메인 타입과 프로퍼티를 안전하게 참조 가능
      • 도메인 타입의 리팩토링을 더 잘 할 수 있음

    환경설정

    QueryDSLConfig.java

    @Configuration
    @RequiredArgsConstructor
    public class QueryDSLConfig {
    
        private final EntityManager entityManager;
    
        @Bean
        public JPAQueryFactory jpaQueryFactory() {
            return new JPAQueryFactory(entityManager);
        }
    }

     

    build.gradle

    plugins {
        id 'java'
        id 'org.springframework.boot' version '3.1.7'
        id 'io.spring.dependency-management' version '1.1.4'
    }
    
    group = 'com.develop'
    version = '0.1'
    
    java {
        sourceCompatibility = '17'
    }
    
    configurations {
        compileOnly {
           extendsFrom annotationProcessor
        }
    }
    
    repositories {
        mavenCentral()
    }
    
    dependencies {
        implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
        implementation 'org.springframework.boot:spring-boot-starter-data-redis-reactive'
    //  implementation 'org.springframework.boot:spring-boot-starter-security'
        implementation 'org.springframework.boot:spring-boot-starter-validation'
        implementation 'org.springframework.boot:spring-boot-starter-web'
    
        compileOnly 'org.projectlombok:lombok'
        runtimeOnly 'com.mysql:mysql-connector-j'
        annotationProcessor 'org.projectlombok:lombok'
        testImplementation 'org.springframework.boot:spring-boot-starter-test'
        testImplementation 'io.projectreactor:reactor-test'
        testImplementation 'org.springframework.security:spring-security-test'
    
        // Swagger
        implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.1.0'
    
        // Query DSL
        implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
        annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta"
        annotationProcessor "jakarta.annotation:jakarta.annotation-api"
        annotationProcessor "jakarta.persistence:jakarta.persistence-api"
    
        // AWS
        implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE'
    }
    
    tasks.named('bootBuildImage') {
        builder = 'paketobuildpacks/builder-jammy-base:latest'
    }
    
    tasks.named('test') {
        useJUnitPlatform()
    }
    
    jar{
        enabled = false
    }
    

    사용법

    Querydsl을 이용해서 쿼리를 작성하려면, 변수와 Query 구현체를 생성해야 한다.

    아래는 예시 도메인이다.

    @Entity
    public class Customer {
        private String firstName;
        private String lastName;
    
        public String getFirstName(){
            return firstName;
        }
    
        public String getLastName(){
            return lastName;
        }
    
        public void setFirstName(String fn){
            firstName = fn;
        }
    
        public void setLastName(String ln) {
            lastName = ln;
        }
    }

    Querydsl에서 해당 도메인이 있는 동일한 패키지에 Q클래스명 이름을 가진 쿼리 타입을 생성한다.

    예시에서는 QCustomer라는 쿼리타입이 생성될 것이다.

    QCustomer은 기본 인스턴스 변수를 갖고 있으며, 정적 필드로 접근할 수 있다.

    QCustomer customer = QCustomer.customer;

     

    물론 아래처럼 변수를 직접 정의할 수도 있다.

    QCustomer customer = new QCustomer("myCustomer");

     


    JPA와 Hibernate API를 모두 지원하므로, 사용하는 API에 따라 다른 인스턴스를 사용한다.

    // where entityManager is a JPA EntityManager
    JPAQuery query = new JPAQuery(entityManager);
    // where session is a Hibernate session
    HibernateQuery query = new HibernateQuery(session);

    QCustomer customer = QCustomer.customer;
    JPAQuery query = new JPAQuery(entityManager);
    Customer bob = query.from(customer)
      .where(customer.firstName.eq("Bob"))
      .uniqueResult(customer);

     

    위에서 예시로 들었던 도메인타입의 객체 중 firstName == Bob인 Customer를 조회하고 싶다면 위의 쿼리를 사용하면 된다. 추가로 다른 용법이 궁금하면 출처의 문서에서 2.1.6 이하 내용을 참고하면 된다.

     

    출처

    Querydsl - 레퍼런스 문서 : http://querydsl.com/static/querydsl/4.0.1/reference/ko-KR/html_single/

     

    Querydsl - 레퍼런스 문서

    본 절에서는 SQL 모듈의 쿼라 타입 생성과 쿼리 기능을 설명한다. com.querydsl.sql.Configuration 클래스를 이용해서 설정하며, Configuration 클래스는 생성자 인자로 Querydsl SQL Dialect를 취한다. 예를 들어, H2

    querydsl.com

    'Spring(Java)' 카테고리의 다른 글

    Spring과 Spring Boot의 차이점  (0) 2024.08.29
    [Spring] Builder 패턴의 장점과 사용방법  (0) 2024.02.08
    [Spring Boot] Error 정리  (0) 2024.01.31
    [Spring] 용어정리(Updated 240131)  (0) 2024.01.31
    Spring MVC  (0) 2023.11.03
Designed by Tistory.