JPQL vs Querydsl

학습 페이지

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();

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

image.png

위 코드를 Qeurydsl로 짜보자.

이를 위해선 Q클래스들을 빌드해야 한다.

image.png

    @Test
    public void startQuerydls() {
        JPAQueryFactory queryFactory = new JPAQueryFactory(em);
        QMember m = new QMember("m"); //alias 필수

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

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

image.png

image.png

이런 쿼리가 만들어져서 나갔다.

위에서 잠깐 살펴보길, Querydsl을 사용하기 위해선 먼저 JPAQueryFactory를 이용해야 한다. 이때 이 팩토리는 팩토리메서드 패턴을 적용해서, 인자에 entityManager를 넘겨줘야 한다.

💡 보통 이 JPAQueryFactory지역변수가 아니라, 따로 필드로 뺀다. 이렇게 해도 동시성문제에 문제없도록 설계되어있다고 함.

그리고 예전에 잠깐 언급하기도 했는데, 생성자를 이용해 q클래스를 생성할 수도 있지만, 여기에는 정적 팩토리 메서드가 적용되어있어서 그냥 스태틱 메서드로도 생성할 수 있음.