QueryDSL이란
- 정적 타입을 이용해서 SQL과 같은 쿼리를 생성할 수 있도록 해주는 프레임워크
- SQL, JPQL을 코드로 작성할 수 있게끔 도와주는 오픈소스 빌더 API
사용 목적
- String방식의 쿼리문을 작성할 시 생기는 문법 오류들을 예방해줌
- IDE의 코드 자동완성 기능을 사용
- 동적 쿼리를 만들기 쉽다
- 리펙토링에 용이하다 -> 코드를 분석하기 용이
의존성 설정(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
}
컴파일 이후 gradle-> 프로젝트 파일 -> Tasks -> other-> compileQuerydsl을 두 번 클릭 시 build -> generated -> querydls파일이 생성됨
QueryDSL방식
1. JPAQuery객체 이용
- 엔티티 매니저를 활용해 생성
- 빌더 형식으로 쿼리를 작성
메서드
- List fetch() : 조회 결과를 리스트로 반환
- T fetchOne() : 단 건의 조회 결과를 반환
- T fetchFirst() : 여러 건의 조회 결과 중 1건을 반환
- Long fetchCount() : 조회 결과의 개수를 반환
- QueryResult fetchResults() : 조회 결과 리스트와 개수를 포함한 QueryResults를 반환
2. JPAQueryFactory
3. 인터페이스 이용
QuerydslPredicateExecutor
- repository에 상속받아서 사용한다.
- Predicate 타입을 매개변수로 받는다
- Predicate : 표현식을 작성할 수 있게 QueryDSL에서 제공하는 인터페이스
@Autowired
AccountRepository accountRepository;
public void crud() {
QAccount account = QAccount.account;
Predicate predicate = account
.firstName.containsIgnoreCase("name")
.and(account.lastName.startsWith("kim"));
Optional<Account> one = accountRepository.findOne(predicate);
메서드
- Optional findById(Predicate predicate) : Predicate에 매칭되는 하나의 entity를 반환
- Iterable findAll(Predicate predicate) : Predicate에 매칭되는 모든 Entitiy를 반환
- long count(Predicate predicate) : Predicate에 매칭되는 Entity의 수를 반환
- boolean exists(Predicate predicate) : Predicate에 매칭되는 결과가 있는지 여부를 반환
QuerydslRepositorySupport 클래스 -> Spring Data JPA에서 제공
- QueryDSL 사용을 support해주는 추상클래스
- CustomRepository를 활용해 리포지토리를 구현 -> 구현해주는 클래스 따로 존재
기본 적용법
public class Repository extends QuerydslRepositorySupport{
public Repository() {
super(Member.class);
}
}
원리
- 기본 Repository는 Spring data JPA와 Custom Repository상속
- Custom Repository Impl은 QuerydslRepositorySupport를 상속
-> Repository를 DI하는 것만으로도 Spring data JPA와 QueryDSL문법을 동시에 사용 가능