티스토리 뷰

Querydsl 정적 타입을 이용해서 SQL과 같은 쿼리를 생성할 수 있도록 해 주는 프레임워크다. 문자열로 작성하거나 XML 파일에 쿼리를 작성하는 대신, Querydsl이 제공하는 플루언트(Fluent) API를 이용해서 쿼리를 생성할 수 있다.

 

단순 문자열과 비교해서 Fluent API를 사용할 때의 장점은 다음과 같다.

  1. IDE의 코드 자동 완성 기능 사용
  2. 문법적으로 잘못된 쿼리를 허용하지 않음
  3. 도메인 타입과 프로퍼티를 안전하게 참조할 수 있음
  4. 도메인 타입의 리팩토링을 더 잘 할 수 있음

Querydsl의 최초 쿼리 언어 대상은 Hibernate의 HQL이었으나, 현재는 JPA, JDO, JDBC, Lucene, Hibernate Search, MongoDB, 콜렉션 그리고 RDFBean을 지원한다.

 

QueryDSL에 대한 Reference : https://querydsl.com/static/querydsl/3.4.3/reference/ko-KR/html_single/

 

Querydsl - 레퍼런스 문서

Querydsl은 JPA, JDO, Mongodb 모듈에서 코드 생성을 위해 자바6의 APT 어노테이션 처리 기능을 사용한다. 이 절에서는 코드 생성을 위한 다양한 설정 옵션과 APT에 대한 대안을 설명한다. 기본적으로 Query

querydsl.com


Gradle 환경에서 기본 세팅은 다음과 같다.

 

◎build.gradle

plugins {
	~
    id 'com.ewerk.gradle.plugins.querydsl' version '1.0.10'  // 동적 쿼리를 위한 추가
}


dependencies {

	~~

    implementation 'com.querydsl:querydsl-jpa' //추가

}


/** 동적 쿼리를 사용하기 위한 추가 작업  **/
def querydslDir = "$buildDir/generated/querydsl"

querydsl {
    jpa = true
    querydslSourcesDir = querydslDir
}

sourceSets {
    main.java.srcDir querydslDir
}

configurations {
    querydsl.extendsFrom compileClasspath
}

compileQuerydsl {
    options.annotationProcessorPath = configurations.querydsl
}

build.gradle에서 다음과 같이 추가 plugin과 dependency를 작성해주고, QueryDSL을 사용하기 위해 필요한 객체인 Q객체를 자동으로 생성해주기 위해 compileQuerydsl 부분을 run 한다.

 

위와 같이 compileQuerydsl 까지 완료하고 나면, 프로젝트에 존재하는 JPA Entity를 자동으로 인식하여 아래와 같이 Q객체를 생성한다.

 

maven환경에서의 세팅은 잘 정리되어 있는 다른 블로그를 참조하자

 

=> maven환경 세팅 & 기본 사용법 

 

마지막으로 동적 쿼리를 사용할 수 있도록 repository 인터페이스에 QuerydslPredicateExecutor<엔티티> 를 추가로 구현받는다. 


모든 설정이 끝이 났으면, 이제 다음과 같이 service 단에서 BooleanBuilder와 BooleanExpression을 사용하여 동적 쿼리를 사용할 수 있다.

 

◎ServiceImpl

 private BooleanBuilder getSearch(PageRequestDTO requestDTO){

        // 검색 타입
        String type = requestDTO.getType();

        // BooleanBuilder 객체 생성
        BooleanBuilder booleanBuilder = new BooleanBuilder();
        QGuestBook qGuestBook = QGuestBook.guestBook;

        // 검색어
        String keyword = requestDTO.getKeyword();

        BooleanExpression expression = qGuestBook.gno.gt(0L);
        booleanBuilder.and(expression);

        if(type == null || type.trim().length() == 0){
            return booleanBuilder;
        }

        // 검색 조건이 존재
        BooleanBuilder conditionBuilder = new BooleanBuilder();

        if(type.contains("t")){
            conditionBuilder.or(qGuestBook.title.contains(keyword));
        }

        if(type.contains("c")){
            conditionBuilder.or(qGuestBook.content.contains(keyword));
        }

        if(type.contains("w")){
            conditionBuilder.or(qGuestBook.writer.contains(keyword));
        }

        // 모든 조건 통합
        booleanBuilder.and(conditionBuilder);

        return booleanBuilder;
    }

BooleanBuilder는 where절을 and나 or 조건을 추가하여 동적으로 처리하기 위한 객체이다. 

또한 좀 더 복잡한 쿼리문을 사용할 시, 조건절을 미리 생성하는 BooleanExpression을 사용하여 활용할 수 있다.

 

Comments