jpql 테스트 코드
@Test
public void startJPQL() {
//member1 조회
Member findMember = em.createQuery("select m " +
"from Member m " +
"where m.username = :username", Member.class)
.setParameter("username", "member1")
.getSingleResult();
}
Querydsl 테스트 코드
@Test
public void startQuerydsl() {
queryFactory = new JPAQueryFactory(em);
Member findMember = queryFactory
.select(member)
.from(member)
.where(member.username.eq("member1")) //자동으로 파라미터 바인딩
.fetchOne();
}
두 테스트 코드 모두 동일한 결과를 반환합니다.
어떤 면에서 jpql은 편리해 보일 수 있지만 Querydsl에는 큰 이점이 숨겨져 있습니다.
장점
jpql은 기본적으로 문자형이기 때문에 오타가 있어도 실행해보기 전까지는 눈치채지 못한다.
그러나 Querydsl은 문자형이 아니므로 오류를 조기에 잡을 수 있습니다.
그리고 코드는 간결하고 유지 관리가 가능합니다.
Querydsl을 사용하려면 먼저 EntityManager로 JPAQueryFactory를 생성해야 합니다.
코드에서는 메소드에서 직접 생성했지만, 필드로 제공하여 사용해도 괜찮습니다.
private final JPAQueryFactory queryFactory;
public MemberRepositoryImpl(EntityManager em) {
this.queryFactory = new JPAQueryFactory(em);
}
필드로 사용될 때 동시성 문제
Spring Framework는 동일한 EntityManager가 여러 스레드에서 동시에 액세스되는 경우에도 각 트랜잭션에 대해 별도의 지속성 컨텍스트를 유지합니다.
동시성 문제에 대해 걱정할 필요가 없습니다.
다음 포스트에서는 querydsl의 기본 기능에 대해 보고하겠습니다.