JPA 를 공부하던중 조건을 붙여 데이터를 조회하는 부분이 필요해서
여러가지 방법을 찾아보다 QeuryDSL 이라는 백엔드코드로 DB 쿼리를 짤 수 있는 방식을 찾았습니다.
JPA 코드와 잘 어울려 코드를 짤 수 있을거같고, 실제로도 사용하는 방식이라해서 공부할까합니다.
QeuryDSL 은 오픈소스 프로젝트로 JPQL을 자바코드로 짤 수 있는 라이브러리입니다.
여기서 DSL 이란 Domain Specific Language 의 줄임말인데 특정 도메인에 특화된 프로그래밍 언어나 API를 의미합니다.
즉, 특정 목적을 해결하기 위해 설계된 언어 라고 생각하시면 됩니다.
* JPQL : (Java Persistence Query Language)
JPA에서 SQL을 추상화해서 설계된 JPQL이라는 객체 지향 쿼리 언어입니다.
1. 자바 코드로 쿼리를 작성하여 컴파일시점에 에러를 잡을 수 있습니다.
기존 myBatis 나 JPQL 같은 방식은 오타나 자잘한 에러들을 런타임시점에서 에러를 파악하기 때문에 실행 전에는 에러의 존재를 알아채기 어렵지만,
자바코드로 작성한 QeuryDSL은 컴파일 시점에서 에러를 잡아주기때문에 에러에 대하여 미리 예방할 수 있습니다.
2. 가독성과 유지보수성의 증가!
기존의 JPQL의 코드는 SQL 의 코드와 유사하게 진행되는데
JPQL과 QeuryDSL 의 같은 동작을 하는 코드를 각 방식으로 보여드리겠습니다.
String jpql = "SELECT l FROM Lecture l WHERE l.price > 10000 AND l.title LIKE '%Spring%'";
List<Lecture> lectures = queryFactory
.selectFrom(QLecture.lecture)
.where(
QLecture.lecture.price.gt(10000)
.and(QLecture.lecture.title.contains("Spring"))
)
.fetch();
위 코드처럼 queryDSL 의 코드가 직관적으로 표현이 가능하고, 코드의 가독성과 유지보수성이 증가합니다.
이외에도 복잡한 쿼리를 잡을수있는 서브쿼리 기능이라던지,
JPA의 Entity를 읽어서 자동으로 QeuryDSL을 위한 클래스를 생성해준다던지
더 다양하고 효율적인 기능들이 많습니다.
gradle 기준 아래 코드를 복사해주시고
// QueryDSL
implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"
clean {
delete file('src/main/generated')
}
추가한 후 gradle 에서 build에 clean 을 클릭하시고
other에 compileJava 를 클릭한 후에

위 사진처럼 src/main/generated 파일이 생성되고, entity클래스 기반으로 QClass 가 생성되면 성공입니다.