QueryDSL
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 -> querydsl 파일이 생성됨
QueryDSL 방식
1. JPAQuery 객체 이용
- 엔티티 매니저를 활용해 생성
- 빌더 형식으로 쿼리를 작성
메서드
- List fetch() : 조회 결과를 리스트로 반환
- T fetchOne() : 단 한건의 조회 결과를 반환
- T fetchFirst() : 여러 건의 조회 결과 중 1건을 반환
- Long fetchCount() : 조회 결과의 개수를 반환
- QueryResult fetchResults() : 조회 결과 리스트와 개수를 포함한 QueryResults를 반환
2. JPAQueryFactory
3. 인터페이스 이용
QuerydlsPredicateExecutor
- 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에 매칭되는 모든 Entity를 반환
- 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 문법을 동시에 사용 가능
'Study > Spring' 카테고리의 다른 글
[Spring 핵심 원리 - 기본편] 싱글톤 패턴 (0) | 2023.02.19 |
---|---|
[Spring 핵심 원리 - 기본편] 웹 애플리케이션과 싱글톤 (0) | 2023.02.19 |
[JPA] 테이블 연관관계 매핑 기초 (0) | 2023.02.10 |
[Spring] Spring Security란? (0) | 2023.01.31 |
[Spring] 좋은 객체 지향 프로그래밍이란? (0) | 2023.01.24 |