QueryDSL 의존성
Spring Version에 따라 의존성이 크게 차이가 난다. 나는 스프링 3.x 이상에서 학습을 했기에, 아래와 같이 설정을 했다.
//Querydsl
implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"
만약 스플이 버전이 2.x 버전이라면 위와는 다르게 해야한다. 최근에 스프링 공식 start.spring.io에서도 3.1부터 지원하기에,, 3버전 이상을 학습하는게 좋지 않나? 생각이 든다.
또한 application.yml에서 쿼리를 정렬한다해도, 예쁘게 되지 않다. 그러므로 아래의 의존성을 추가해주자.
// query 값 정렬
implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.0'
QueryDSL 사용법
QueryDsl을 사용하기 위해서 가장 첫번째로 아래와 같이 JPAQueryFactory를 생성해줘야한다.
JPAQueryFactory queryFactory = new JPAQueryFactory(em);
그 이후로, 어떠한 객체를 쿼리를 활용할 Q객체를 사용할 것인지 아래와 같이 생성할 수 있다.
"m"으로 구성된 것은 QMember 객체끼리 구별하기 위함인데 사실상 크게 중요하지 않다.
jpql에서 select m From Member m 이렇게 작성할 때 m과 같은 앨리어스 역할이다.
QMember qMember = new QMember("m"); // 별칭 직접 사용
QMember qMember = QMember.membr; // 기본 인스턴스 사용
2가지 방법으로 객체를 생성할 수 있는데, 기본적으로 제공하는 인스턴스를 사용하자.
실제 예제를 보자.
@Test
void startQuerydsl() {
QMember m = QMember.member;
Member findMember = queryFactory
.select(m)
.from(m)
.where(m.username.eq("member1"))
.fetchOne();
assertThat(findMember.getUsername()).isEqualTo("member1");
}
이렇게 되어있을 때 m을 생성 후 직접 넣어주는 방법이다.
위 방법은 생성 과정을 거쳐야하므로 아래와 같이 직접 넣어준다.
@Test
void startQuerydsl() {
Member findMember = queryFactory
.select(QMember.member)
.from(QMember.member)
.where(QMember.member.username.eq("member1"))
.fetchOne();
assertThat(findMember.getUsername()).isEqualTo("member1");
}
그리고 이를 static import까지 하게된다면 아래와 같다.
@Test
void startQuerydsl() {
Member findMember = queryFactory
.select(member)
.from(member)
.where(member.username.eq("member1"))
.fetchOne();
assertThat(findMember.getUsername()).isEqualTo("member1");
}
보기 정말 깔끔해졌다. 앞으로 위와 같은 방법을 사용하여 queryDSL을 작성할 것이다.
실제 쿼리를 보면
select
member1
from
Member member1
where
member1.username = ?
이렇게 member1로 앨리어스되어 조회된 것을 확인해 볼 수 있다.
QMember
public class QMember extends EntityPathBase<Member> {
// ...
public static final QMember member = new QMember("member1");
// ...
실제 QMember의 static member가 "member1"로 되어있기 떄문이다.
만약 self join해야할 경우가 생긴다면 처음과 같이 앨리어스를 만들어 사용해야한다. 하지만 그 외의 경우에는 static import하여 사용할 것이다.
위와 같은 queryDSL 코드들은 jpql Builder 역할을 하는 것이다. 결국 실행되는 것은 작성한 코드들이 jpql로 실행된다.
'JPA > QueryDSL' 카테고리의 다른 글
[QueryDSL] 6. 동적 쿼리(중요⭐️) - BooleanBuilder, Where 다중 파라미터 사용 (0) | 2023.12.06 |
---|---|
[QueryDSL] 5. QueryDSL의 프로젝션과 결과 반환, @QueryProjection (0) | 2023.12.06 |
[QueryDSL] 4. QueryDSL의 Join과 FetchJoin (0) | 2023.12.06 |
[QueryDSL] 3. 정렬과 페이징, SubQuery (0) | 2023.12.04 |
[QueryDSL] 2. QueryDSL 문법 VS JPQL 문법 비교 (0) | 2023.12.01 |