ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 실전 2 - 10 QueryDSL 소개
    SPRING-BOOT 2021. 3. 12. 15:14

    QueryDSL 소개

    http://www.querydsl.com

     

    Querydsl - Unified Queries for Java

    Unified Queries for Java. Querydsl is compact, safe and easy to learn.

    JPQL을 자바코드로 작성할 수 있게 해준다.

     

    실무에서는 조건에 따라서 실행되는 쿼리가 달라지는 동적 쿼리를 많이 사용한다.

    주문 내역 검색으로 돌아가보고, 이 예제를 Querydsl로 바꾸어 보자.

     

     

    Querydsl로 처리

        private final JPAQueryFactory query ;
    
        public OrderRepository(EntityManager em) {
            this.em = em;
            this.query = new JPAQueryFactory(em);
        }
        
     	public List<Order> findAll(OrderSearch orderSearch){
    
            return query.select(order)
                    .from(order)
                    .join(order.member, member) //order과 member를 조인할떄 member alias
                    .where(statusEq(orderSearch.getOrderStatus()), nameLike(orderSearch.getMemberName())) // ,는 and 조건
                    .limit(100)
                    .fetch();
                    
                    //        JPAQueryFactory query = new JPAQueryFactory(em);
    //        return query.select(order)
    //                .from(order)
    //                .join(order.member, member) //order과 member를 조인할떄 member alias
    //                .where(statusEq(orderSearch.getOrderStatus()), nameLike(orderSearch.getMemberName())) // ,는 and 조건
    //                .limit(100)
    //                .fetch();
            
        }
    
        private BooleanExpression statusEq(OrderStatus statusCond) {
             if (statusCond == null) {
                return null;
             }
             return order.status.eq(statusCond);
        }
    
        private BooleanExpression nameLike(String nameCond) {
           if (!StringUtils.hasText(nameCond)) {
             return null;
           }
           return member.name.like(nameCond);
        }

     

    static improt를 제공하기떄문에 코드를 훨씬 간단하게 줄일 수 있다.

    build.gradle에 querydsl 추가

    //querydsl 추가
    buildscript {
      dependencies {
     	 classpath("gradle.plugin.com.ewerk.gradle.plugins:querydslplugin:1.0.10")
      }
    }
    
    plugins {
      id 'org.springframework.boot' version '2.1.9.RELEASE'
      id 'java'
    }
    
    apply plugin: 'io.spring.dependency-management'
    apply plugin: "com.ewerk.gradle.plugins.querydsl"
    
    group = 'jpabook'
    version = '0.0.1-SNAPSHOT'
    sourceCompatibility = '1.8'
    
    configurations {
      compileOnly {
     	 extendsFrom annotationProcessor
      }
    }
    
    repositories {
      mavenCentral()
    }
    dependencies {
    
        implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
        implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
        implementation 'org.springframework.boot:spring-boot-starter-web'
        implementation 'org.springframework.boot:spring-boot-devtools'
        implementation 'com.fasterxml.jackson.datatype:jackson-datatype-hibernate5'
        implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.6'
        compileOnly 'org.projectlombok:lombok'
        runtimeOnly 'com.h2database:h2'
        annotationProcessor 'org.projectlombok:lombok'
        testImplementation 'org.springframework.boot:spring-boot-starter-test'
        //querydsl 추가
        implementation 'com.querydsl:querydsl-jpa'
        //querydsl 추가
        implementation 'com.querydsl:querydsl-apt'
    
    }
    
    
    //querydsl 추가
    //def querydslDir = 'src/main/generated'
    def querydslDir = "$buildDir/generated/querydsl"
    
    
    querydsl {
        library = "com.querydsl:querydsl-apt"
        jpa = true
        querydslSourcesDir = querydslDir
    }
    
    sourceSets {
        main {
          java {
           srcDirs = ['src/main/java', querydslDir]
          }
    	}
    }
    
    compileQuerydsl{
      options.annotationProcessorPath = configurations.querydsl
    }
    
    configurations {
      querydsl.extendsFrom compileClasspath
    }

    complieQuerydsl 클릭
    generated 파일 생성

    Querydsl은 SQL(JPQL)과 모양이 유사하면서 자바 코드로 동적 쿼리를 편리하게 생성할 수 있다.

     

    실무에서는 복잡한 동적 쿼리를 많이 사용하게 되는데, 이때 Querydsl을 사용하면 높은 개발 생산성을 얻으면서 동시에 쿼리 오류를 컴파일 시점에 빠르게 잡을 수 있다. 꼭 동적 쿼리가 아니라 정적 쿼리인 경우에도 다음과 같은 이유로 Querydsl을 사용하는 것이 좋다

     

    · 직관적인 문법

    · 컴파일 시점에 빠른 문법 오류 발견 (자바 코드이기 때문에)

    · 코드 자동완성(JPQL이 지원하는것을 90%지원해줌)

    · 코드 재사용(이것은 자바다)

    JAVA CODE이기때문에 이런 컨디션들을 재사용할 수 있다.

    · JPQL new 명령어와는 비교가 안될 정도로 깔끔한 DTO 조회를 지원한다

    · 코드가 줄고 동적쿼리까지 가능

     

    Querydsl은 JPQL을 코드로 만드는 빌더 역할을 대신 할 뿐이다. 따라서 JPQL을 잘 이해하면 금방 배울 수 있다.

    Querydsl은 JPA로 애플리케이션을 개발 할 때 선택이 아닌 필수라 생각한다.

     

    참고: gernerated된 코드들은 깃에서 뺴야한다 git ignore로 빼야한다.

    참고: Querydsl에 대한 내용은 분량이 상당해서, 별도의 강의를 계획중이다

    댓글

Designed by Tistory.