개요
- JPQL 과 Query DSL 을 비교해보자.
JPQL
- JPQL(Java Persistence Query Language)
- SQL 을 추상화한 객체 지향 쿼리 언어이다.
- 테이블이 아닌 엔티티 객체를 대상으로 조회하는 쿼리이다.
JPQL vs Querydsl
@PersistenceContext
EntityManager em;
@Test
@DisplayName("JPQL")
void startJPQL() {
String query = "select m from Member m where m.userName = :userName";
Member findMember = em.createQuery(query, Member.class)
.setParameter("userName", "member1")
.getSingleResult();
Assertions.assertThat(findMember.getUserName()).isEqualTo("member1");
}
@Test
@DisplayName("Query DSL")
void startQuerydsl() {
//given
JPAQueryFactory jpaQueryFactory = new JPAQueryFactory(em);
QMember m = new QMember("m");
//when
Member findMember = jpaQueryFactory
.select(m)
.from(m)
.where(m.userName.eq("member1")) // 파라미터 바인딩 처리
.fetchOne();
//then
Assertions.assertThat(findMember.getUserName()).isEqualTo("member1");
}
- Query DSL 특징 & 이점
- EntityManager 로 JPAQueryFactory 생성
- Querydsl 은 JPQL 빌더
- JPQL: 문자(런타임 시점 오류), Querydsl: 코드(컴파일 시점 오류)
- JPQL: 파라미터 바인딩 직접, Querydsl: 파라미터 바인딩 자동 처리
- 동시성 문제
- JPAQueryFactory를 필드로 제공하면 동시성 문제는 어떻게 될까?
- SpringFramework 는 여러 쓰레드에서 동시에 같은 EntityManager에 접근해도, 트랜잭션 마다 별도의 영속성 컨텍스트를 제공하기 때문에, 동시성 문제는 걱정하지 않아도 된다.
- Thread Safe 하게 설계되어 있다.