Querydsl과 jpql의 차이

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의 기본 기능에 대해 보고하겠습니다.