티스토리 뷰

QueryDSL이란 ?

먼저 JPQL에 대해서 뭔지 알아야 한다. JPQL은 엔티티를 조회하기 위한 객체지향 쿼리로, 특징은 문자로 쿼리를 작성한다는 점이다.

한번 회원 이름이 kim인 엔티티를 조회하는 쿼리를 작성해보자.

 

String jpql = "select m from Member as m where m where m.username = 'kim'";

 

이런식으로 SQL을 추상화해서 특정 데이터베이스(h2, mysql 등등)에 의존하지 않는다. 

여기까지만 알아보고, 그럼 왜 QueryDSL이 탄생했는지 알아보자.

 

어떠한 새로운 것이 탄생하게 된 배경은 기존의 것이 문제가 있기 때문이다. 

JPQL은 문자로 작성한다는 점이 단점이다. 

예를 들어 JPQL에서 다음과 같은 코드를 작성해봤다고 가정해보자.

 

select m from Memberr m

 

이 쿼리에는 Member을 실수로 Memberr 작성하여 오류가 있다. 하지만 컴파일이 정상적으로 성공하고

애플리케이션을 서버에 배포할 수 있다. 이 에러는 언제 발생할까?

바로 이 쿼리가 동작되는 런타임 시점에 오류가 발생한다. 즉, 실수로 잘못 입력해도 문자기반이기 때문에 오류가 발생했는지 알 수 없다. 또 동적쿼리를 작성하기 어렵다는 단점도 있다. 

그래서 만든 것이 Criteria와 QueryDSL이다. 

 

 Criteria와 QueryDSL의 특징은 문자기반이 아닌 코드로 JPQL을 작성한다. 

코드로 작성함으로써 오류가 발생했는지 컴파일시점에 알 수 있게 된다. JPQL의 단점을 보완한 것이다. 

좀 더 장점을 말해보자면 다음과 같다. 

 

  • 컴파일 시점에 오류를 발견할 수 있다.
  • IDE를 사용하면 코드 자동완성 기능을 지원한다.
  • 동적 쿼리를 작성하기 편하다. 

참고로 JPQL은 동적쿼리를 작성하려면 문자들을 쪼개서 하나하나 연결해주어야 한다. 

하지만 결국은 JPQL에서 나온 것들이기 때문에 "Criteria와 QueryDSL은 JPQL 빌더 역할을 한다." 라고 한다.

우리는 여기서 QueryDSL에 대해서 알아볼건데, Criteria와 차이점은 QueryDSL은 쉽고 한눈에 알아볼 수 있다는 점이고, 

Criteria은 짜는 것이 너무 복잡하고 어렵다. 

 

아래는 Criteria로 검색쿼리를 작성한 코드다. 살짝봐도 어지럽다..

 

결국 QueryDSL이란 쿼리를 문자가 아닌 코드로 작성해도 쉽고 간결하며, 모양도 쿼리와 비슷하게 개발할 수 있는 프로젝트다. 

 

QueryDSL 코드로 맛보기

앞으로 알아볼 QueryDSL에 대해 공부하기 위해 잠깐 QueryDSL로 작성한 코드를 보자.

 

//준비
JPAQuery query = new JPAQuery(em);
QMember member = QMember.member;

//쿼리, 결과조회
List<Member> members = 
	query.from(member)
    .where(member.username.eq("kim"))
    .list(member);

 

코드를 보는 것만으로 무엇을 하는지 한눈에 들어오고, 쉽고 간결하다. 준비 과정은 선언 시에 생략할 수 있다. 

 

QueryDSL을 사용하기 위한 환결설정

QueryDSL도 단점 아닌 단점이 존재한다. 바로 환경설정이 빡세고 쿼리타입을 사용해야 한다는 점이다. 

build.gradle의 dependencies에 QueryDSL 의존성을 추가해주어야 한다.

(버전은 다를 수 있다. 최신버전이 있다면 최신버전으로 하자)

 

implementation 'com.querydsl:querydsl-jpa:5.0.0'
annotationProcessor group: 'com.querydsl', name: 'querydsl-apt', version: '5.0.0'

 

그리고  build.gradle에 또 추가해주어야 할 설정들이 있다. 

 

def querydslDir = "$buildDir/generated/querydsl"

querydsl {
	jpa = true
	querydslSourcesDir = querydslDir
}
sourceSets {
	main.java.srcDir querydslDir
}
compileQuerydsl{
	options.annotationProcessorPath = configurations.querydsl
}

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
	querydsl.extendsFrom compileClasspath
}

 

이렇게 간단하게 QueryDSL에 대한 개념과 코드, 환경설정을 알아보았다. 

(나중에 실제로 적용해보니까 설정하는 것이 약간 다르다. 환결설정 내용은 여기를 참고하자)

다음 포스팅에서는 본격적으로 어떻게 사용하는지 알아보겠다. 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday