-
실전 2 - 10 QueryDSL 소개SPRING-BOOT 2021. 3. 12. 15:14
QueryDSL 소개
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에 대한 내용은 분량이 상당해서, 별도의 강의를 계획중이다
'SPRING-BOOT' 카테고리의 다른 글
intellij에서 gitignore 쉽게 설정하기. (0) 2021.05.14 #RedirectAttributes로 화면에 일회성 msg 전달 (0) 2021.05.07 #실전 2 - 9 스프링 데이터 JPA 소개 (0) 2021.03.12 #실전2 - 8 OSIV와 성능 최적화 (0) 2021.03.12 #실전2 - 7 컬렉션 조회 최적화 (0) 2021.03.09