Database & ORM/JPA 프로젝트

7. Querydsl 적용

MJ.Lee 2022. 3. 11. 09:08

JPQL과 Querydsl

JPQL은 JPA에서 제공하는 가장 중요한 객체지향 쿼리 언어이다.

JPQL 특징

  • 테이블이 아닌 객체를 대상으로 검색하는 객체지향 쿼리다.
  • SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않는다.

예를 들면 아래의 select문과 같다. Item이란 테이블이 아니라, Item 객체를 대상으로 검색한다.

Querydsl은 JPQL을 편하게 작성할 수 있게 도와주는 JPQL 빌더 역할을 한다.
오픈 소스이므로 라이브러리를 설치해야 한다.

Querydsl 라이브러리 Gradle로 설치

build.gradle에 아래 부분을 추가해준다.

	implementation 'com.querydsl:querydsl-jpa'
	annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jpa"
	annotationProcessor "jakarta.persistence:jakarta.persistence-api"
	annotationProcessor "jakarta.annotation:jakarta.annotation-api"

Settings를 IntelliJ로 둔다.

QClass가 src/main/generated경로로 생성된다.
Gradle로 하면 build/generated/sources/annotationProcessor/java/main경로에 생성된다.

Querydsl 사용하여 주문 목록 조회

요건

  • 검색 조건으로 회원명과 주문상태가 있다.
  • 검색을 누르면 주문 목록을 조회해온다.

QueryDSL 기본 문법

프로젝트에 Querydsl 5버전을 사용했다.
Querydsl 5버전이 '자바 ORM 표준 JPA 프로그래밍'에 나온 3버전과 달라서, 문법이 변경되었다. 변경된 기본 문법은 여기에 자세히 정리되어있다.

  • JPAQueryFactory 객체를 사용하여 아래처럼 query를 만들어 사용하면 된다.
  • selectFrom 뿐만 아니라, update, delete를 이용해 수정, 삭제도 가능하다.
  • where, orderBy, groupBy처럼 문법이 SQL과 유사하여 이해하기 어렵지 않다.
  • fetch()하면 조회 결과들을 가지고 오고, fetchOne()을 사용하면 한 개의 결과만 가지고 온다.

BooleanBuilder : 동적 Query 작성

BooleanBuilder를 사용하면 특정 조건에 따른 동적 쿼리를 편리하게 생성할 수 있다.
고객명(MemberName)과 주문상태(OrderStatus) 유무에 따라 동적으로 쿼리를 생성한다.

StringUtils는 org.springframework.util.StringUtils 이다.
StringUtils.hasText 메소드는 문자열의 내용이 없거나, null이면 false를 반환한다.
StringUtils의 메소드에 관한 정리는 여기를 참고하면 된다.