티스토리 뷰
Querydsl 정적 타입을 이용해서 SQL과 같은 쿼리를 생성할 수 있도록 해 주는 프레임워크다. 문자열로 작성하거나 XML 파일에 쿼리를 작성하는 대신, Querydsl이 제공하는 플루언트(Fluent) API를 이용해서 쿼리를 생성할 수 있다.
단순 문자열과 비교해서 Fluent API를 사용할 때의 장점은 다음과 같다.
- IDE의 코드 자동 완성 기능 사용
- 문법적으로 잘못된 쿼리를 허용하지 않음
- 도메인 타입과 프로퍼티를 안전하게 참조할 수 있음
- 도메인 타입의 리팩토링을 더 잘 할 수 있음
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/
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환경에서의 세팅은 잘 정리되어 있는 다른 블로그를 참조하자
마지막으로 동적 쿼리를 사용할 수 있도록 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을 사용하여 활용할 수 있다.
'[JAVA] > Spring-Boot' 카테고리의 다른 글
[Spring-Boot] Spring Security 2: Configuration (0) | 2021.07.19 |
---|---|
[Spring-Boot] Spring Security 1: 시작하기 (0) | 2021.07.19 |
[Spring-Boot] Thymeleaf 3: 페이지 삽입 (0) | 2021.07.09 |
[Spring-Boot] Thymeleaf 2: Thymeleaf 문법 (0) | 2021.07.08 |
[Spring-Boot] Thymeleaf 1: 시작하기 (0) | 2021.07.08 |
- Async
- await
- 인천 구월동 이탈리안 맛집
- 이탈리안 레스토랑
- react-native
- Promise
- 파니노구스토
- 인천 구월동 맛집
- AsyncStorage
- 정보보안기사 #실기 #정리
- react
- javascript
- redux-thunk
- 맛집
- redux
- Total
- Today
- Yesterday