Querydsl 사용
Querydsl
을 사용하기 위해서는 EntityManager
와 JPAQueryFactory
라는 2개의 객체가 필요하다.
( EntityManager
는 영속성 컨텍스트를 관리하는 객체이고, JPAQueryFactory
는 Querydsl
을 사용하기 위한 객체이다. )
예시는 다음과 같다.
@Repository
public class TestRepository {
private final EntityManager em;
private final JPAQueryFactory jpaQueryFactory;
public TestRepository(EntityManager em) {
this.em = em;
// JPAQueryFactory 를 생성할 때는 생성자에 EntityManager 를 넘겨줘야 한다.
this.jpaQueryFactory = new JPAQueryFactory(em);
}
...
}
JPQL vs Querydsl
Querydsl
의 문법과 지원 기능들을 하나씩 알아보기에 앞서, JPQL
을 직접 사용할 때와 Querydsl
을 사용할 때의 차이를 코드로 확인해보자.
JPQL
Querydsl
JQPL
은 쿼리문을 문자열 기반으로 작성해야 한다. 따라서 쿼리문에 오타가 있거나 잘못 작성하는 경우, 컴파일 시점에는 이를 알 수 없고, 런타임 시점에 에러가 발생하고 나서야 이를 인지할 수 있다.
반면에 Querydsl
은 쿼리를 자바 코드 기반으로 작성하기 때문에, 쿼리문에 오타가 있거나 잘못 작성하는 경우 컴파일 시점에 이를 인지할 수 있다.
참고) 기본 Q-Type 활용
Querydsl
사용 예시를 다시 확인해 보자.QMember
객체를 생성해야 한다. 따라서 이런 불편함을 해소하기 위해 QType
내부에는 미리 생성해놓은 기본 인스턴스가 제공된다. 실무에서는 주로 이를 활용한다.QMember qMember = new QMember("member1");
생성자에 전달되는 변수(member1
)는 JPQL 에서 별칭으로 사용된다. 따라서 같은 테이블을 조인해서 서로를 구분해야 하는 경우는 직접 인스턴스를 생성해주어야 하고, 그러한 경우가 아니면 기본 인스턴스를 사용하자.QMember
가 계속 반복되는 것이 효율적이지 않아보인다. 이 부분도 static import
를 해줌으로써 반복 코드를 줄일 수 있다.
Querydsl
은 JPQL
을 자바 코드 기반으로 편리하게 작성할 수 있도록 도와주는 JPQL builder
역할을 하는 것 뿐이다.
따라서 기본적으로 JPQL
, 더 나아가 SQL
에 대한 깊은 이해가 중요하다.
강의를 듣고 정리한 글입니다. 코드와 그림 등의 출처는 김영한 강사님께 있습니다.