[ 김영한 Querydsl #2 ] JPQL vs Querydsl

김수호·2024년 6월 8일
0
post-thumbnail

Querydsl 사용

Querydsl 을 사용하기 위해서는 EntityManagerJPAQueryFactory 라는 2개의 객체가 필요하다.
( EntityManager 는 영속성 컨텍스트를 관리하는 객체이고, JPAQueryFactoryQuerydsl 을 사용하기 위한 객체이다. )

예시는 다음과 같다.

@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 를 해줌으로써 반복 코드를 줄일 수 있다.

 

QuerydslJPQL 을 자바 코드 기반으로 편리하게 작성할 수 있도록 도와주는 JPQL builder 역할을 하는 것 뿐이다.

따라서 기본적으로 JPQL, 더 나아가 SQL 에 대한 깊은 이해가 중요하다.


강의를 듣고 정리한 글입니다. 코드와 그림 등의 출처는 김영한 강사님께 있습니다.

profile
현실에서 한 발자국

0개의 댓글