Queryds이란 무엇인가?
백엔드 기술은 주로 스프링 부트, 스프링 데이터 JPA를 조합해서 사용합니다. 하지만, 이러한 기술들로도 해결하지 못한 문제들이 있습니다.
바로 복잡한 쿼리, 동적 쿼리와 같은 문제들을 해결할 수 없습니다. 이러한 문제들을 손쉽게 해결할 수 있는 기술이 Querydsl입니다.
Querydsl은 HQL(Hibernate Query Language) 쿼리를 안전하게 생성 및 관리해 주는 프레임워크입니다.
또한 쿼리를 자바 언어의 한계를 넘어서 자바 코드로 작성함과 더불어, 문법 오류를 컴파일 시점에 시점에 잡아줍니다.
문법이 SQL과 유사하기에 쉽게 학습할 수 있고, 복잡한 쿼리도 손쉽게 작성할 수 있게 됩니다.
JPQL과의 차이를 통해 장점을 설명드리겠습니다.
@Test
public void startJPQL() {
//member1을 찾아라.
Member findMember = em.createQuery("select m from Member m where m.username = : username", Member.class)
.setParameter("username", "member1")
.getSingleResult();
Assertions.assertThat(findMember.getUsername()).isEqualTo("member1");
}
@Test
public void startQuerydsl() {
Member findMember = queryFactory
.select(member)
.from(member)
.where(member.username.eq("member1"))
.fetchOne();
assertThat(findMember.getUsername()).isEqualTo("member1");
}
JPQL같은 경우는 실행 시점에 컴파일러가 오류를 확인할 수 있습니다. 하지만, Querydsl 같은 경우에는 자바 언어로 작성하기에, 컴파일 시점에 오류를 확인할 수 있습니다. 더불어 자바 코드기 때문에, 문법을 작성할 경우 자동 완성의 도움을 받을 수 있습니다. 이에 더하여 메서드를 추출하여 코드를 재사용할 수 있다는 큰 장점이 있습니다.
스프링 데이터 JPA와 Querydsl 기술을 사용하게 되면, 단순 반복된 코드들을 줄일 수 있고, 개발자들도 핵심 비즈니스 로직을 작성하는데 집중할 수 있게 됩니다.
기본 세팅을 하기 위해, build.gradle에 plugins과 dependencies에 다음과 같은 코드를 추가해주고, 추가적인 설정이 필요합니다.
id 'io.spring.dependency-management' version '1.0.8.RELEASE'(plugins)
implementation 'com.querydsl:querydsl-jpa'(dependencies)
def querydslDir = "$buildDir/generated/querydsl"
querydsl {
jpa = true
querydslSourcesDir = querydslDir
}
sourceSets {
main.java.srcDir querydslDir
}
configurations {
querydsl.extendsFrom compileClasspath
}
compileQuerydsl {
options.annotationProcessorPath = configurations.querydsl
}
(기타 및 추가 설정)
또한 Querydsl에서는 엔티티로 설정된 클래스에 Q모델이라는 쿼리타입 클래스를 미리 생성해놓고 메타데이터를 사용해서 쿼리를 메서드 기반으로 작성하기에 검증용 Q타입 생성이 필요합니다.
Q타입 생성 방법
Gradle -> Tasks -> other -> compileQuerydsl (클릭)
다음과 같이 build폴더 아래에 Q타입 클래스들이 생성되었음을 확인할 수 있게 됩니다.
Q타입 인스턴스 사용 방법
- QMember qMember = new QMember("m"); // 별칭 직접 지정
- QMember qMember = QMember.member // 기본 인스턴스 사용
import static study.QueryDSL.entity.QMember.*;
@Test
public void startQuerydsl3() {
Member findMember = queryFactory
.select(member)
.from(member)
.where(member.username.eq("member1"))
.fetchOne();
assertThat(findMember.getUsername()).isEqualTo("member1");
}
다음과 같이 querydsl을 작성할 때, 별칭을 직접 지정해서 생성하는 방법과, 기본 인스턴스를 사용하는 방법이 있습니다. 저는 기본 인스턴스를 static import하여 사용하는 방식으로 다음과 같이 코드를 작성하였습니다. 왜냐하면 가독성도 더욱 좋고, 직관적이며, 기존 SQL문과 유사하게 보이기 때문입니다.
'Java > Spring' 카테고리의 다른 글
[Spring] Spring Data JPA Paging, Sort 기능 (0) | 2023.03.18 |
---|---|
[Spring] Spring Data JPA 공통 인터페이스 (0) | 2023.03.18 |
[Spring] OSIV[Open Session In View]를 적절히 사용하여 성능 최적화 (0) | 2023.03.08 |
[Spring] 변경 감지(Dirty checking)와 병합(merge) (0) | 2023.03.08 |
[Spring] 애브리타임 게시판 부가기능 추가(댓글, 쪽지, 좋아요, 즐겨찾기, 페이징처리) (0) | 2023.02.11 |