성장/jpa Querydsl 정리

JPQL과 Querydsl 비교

nix-be 2024. 7. 18. 10:51
728x90

JPQL과 Querydsl 비교

JPQL (Java Persistence Query Language)

  • 문자 기반 쿼리: JPQL은 문자열을 기반으로 쿼리를 작성하므로, 쿼리 문법 오류는 실행 시점에 발견됩니다.
  • 직접 파라미터 바인딩: 파라미터를 직접 바인딩해야 합니다.
  • 예제:
@Test
public void startJPQL() {
    String qlString = "select m from Member m where username =:username";
    Member findMember = em.createQuery(qlString, Member.class)
            .setParameter("username", "member1")
            .getSingleResult();

    assertThat(findMember.getUsername()).isEqualTo("member1");
}

 

Querydsl

  • 코드 기반 쿼리: Querydsl은 코드를 기반으로 쿼리를 작성하므로, 문법 오류는 컴파일 시점에 발견됩니다.
  • 자동 파라미터 바인딩: 파라미터 바인딩이 자동으로 처리됩니다.
  • 동시성 문제 해결: JPAQueryFactory를 생성할 때 제공하는 EntityManager에 따라 동시성 문제가 해결됩니다. 스프링 프레임워크는 여러 쓰레드에서 동시에 같은 EntityManager에 접근해도, 트랜잭션마다 별도의 영속성 컨텍스트를 제공하기 때문에 동시성 문제는 걱정하지 않아도 됩니다.
  • 예제:
@Test
public void startQuerydsl() {
    queryFactory = new JPAQueryFactory(em);
    QMember m = QMember.member;

    Member findMember = queryFactory
            .select(m)
            .from(m)
            .where(m.username.eq("member1"))
            .fetchOne();

    assertThat(findMember.getUsername()).isEqualTo("member1");
}

Q클래스 인스턴스를 사용하는 두 가지 방법

  1. 별칭 직접 지정:
  2. QMember qMember = new QMember("m");
  3. 기본 인스턴스 사용:
  4. QMember qMember = QMember.member;

 

기본 인스턴스를 static import와 함께 사용

  • 예제:
import static study.querydsl.entity.QMember.*;

@Test
public void startQuerydsl3() {
    // member1을 찾아라.
    Member findMember = queryFactory
            .select(member)
            .from(member)
            .where(member.username.eq("member1"))
            .fetchOne();

    assertThat(findMember.getUsername()).isEqualTo("member1");
}

Querydsl을 JPQL로 볼 수 있는 방법

  • 설정:
  • spring.jpa.properties.hibernate.use_sql_comments: true
728x90