QueryDSL - JPA JPQL vs JPA QueryDSL

목차

JPA JPQL

JPQL 은 EntityManager 객체내 creatQuery 메소드를 이용해 쿼리를 작성한 후 실행한다.

@Test
public void startJPQL(){
// member1 을 찾아라
Member findByJPQL = em.createQuery("select m from Member m where m.username = :username", Member.class)
.setParameter("username", "member1")
.getSingleResult();

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

JPA QueryDSL

JPA QueryDSL 은 JPA Entity 와 관련해 정적 타입으로 쿼리를 작성 하게 해주는 라이브러리

JPA QueryDSL 에서는 JPAQueryFactory 객체를 이용해 쿼리를 작성합니다. JPAQueryFactory 객체를 통해 생성된 쿼리가 JPA Entity 를 대상으로 쿼리를 생성하고 실행하고 상태를 관리하기 위해서는 EntityMagager 인스턴스가 필요합니다.

따라서, JPA 기능을 사용하고 Entity 를 대상으로 쿼리를 수행할 수 있도록 EntityMagager 객체를 JPAQueryFactory 객체 생성시 전달할 필요가 있습니다.

@Test
public void startQuerydsl(){
// JPAQueryFactory 객체 생성시 EntityManager 를 인자로 넘겨줘 Entity 에 대한 쿼리를 작성할 수 있도록 한다.
JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);
QMember qMember = new QMember("m");

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

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

결과

select
member0_.member_id as member_i1_1_,
member0_.age as age2_1_,
member0_.team_id as team_id4_1_,
member0_.username as username3_1_
from
member member0_
where
member0_.username=?

QueryDSL 특징

  • Querydsl 은 Parameter binding 시 PreparedStatement 의 Parameter binding 을 사용해 SQL Injection 공격으로부터 안전하다.
  • JPQL 은 런타임 오류가 발생하나 QueryDsl 은 컴파일시 에러가 발생하게 된다.
Share