오봉이와 함께하는 개발 블로그

Querydsl - JPQL vs Querydsl 본문

BE/JPA

Querydsl - JPQL vs Querydsl

오봉봉이 2022. 9. 15. 23:43
728x90

시작 - JPQL vs Querydsl

테스트 기본 코드

지금부터는 이 예제로 실행한다.

@SpringBootTest
@Transactional
public class QuerydslBasicTest {

    @Autowired
    EntityManager em;

    @BeforeEach
    public void before() {
        Team teamA = new Team("teamA");
        Team teamB = new Team("teamB");
        em.persist(teamA);
        em.persist(teamB);
        Member member1 = new Member("member1", 10, teamA);
        Member member2 = new Member("member2", 20, teamA);
        Member member3 = new Member("member3", 30, teamB);
        Member member4 = new Member("member4", 40, teamB);
        em.persist(member1);
        em.persist(member2);
        em.persist(member3);
        em.persist(member4);
    }
}

Querydsl vs JPQL

@SpringBootTest
@Transactional
public class QuerydslBasicTest {
    @PersistenceContext
    EntityManager em;
    JPAQueryFactory queryFactory;
    @BeforeEach
    public void before() {
        queryFactory = new JPAQueryFactory(em);
        //...
    }

    @Test
    public void startJPQL() {
        //member1을 찾아라.
        String qlString = "select m from Member m " +
                "where m.username = :username";
        Member findMember = em.createQuery(qlString, Member.class)
                .setParameter("username", "member1")
                .getSingleResult();
        assertThat(findMember.getUsername()).isEqualTo("member1");
    }
    @Test
    void startQuerydsl() {
        JPAQueryFactory queryFactory = new JPAQueryFactory(em);
        QMember m = new QMember("m");
        Member findMember = queryFactory
                .select(m)
                .from(m)
                .where(m.username.eq("member1"))//파라미터 바인딩 처리
                .fetchOne();
        assertThat(findMember.getUsername()).isEqualTo("member1");
    }
}

JPQL에서는 파라미터 바인딩을 했어야 헀는데(.setParameter("username", "member1")), Querydsl은 파라미터 바인딩을 자동으로 해준다.(("member1"))

JPQLQueryFactory를 필드로 제공하면 동시성 문제는 어떻게 될까?
동시성 문제는 JPQLQueryFactory를 생성할 때 제공하는 EntityManager(em)에 달려있다.
스프링 프레임워크는 여러 쓰레드에서 동시에 같은 EntityManager에 접근해도, 트랜잭션 마다 별도의 영속성 컨텍스트를 제공하기 때문에, 동시성 문제는 걱정하지 않아도 된다.

인프런 김영한 지식공유자님 강의 : 실전! Querydsl
728x90

'BE > JPA' 카테고리의 다른 글

Querydsl - 검색 조건 쿼리  (0) 2022.09.16
Querydsl - 기본 Q-Type 활용  (0) 2022.09.15
Querydsl - 설정, 예제 도메인 모델  (0) 2022.09.15
스프링 데이터 JPA - 네이티브 쿼리  (0) 2022.09.14
스프링 데이터 JPA - Projections  (0) 2022.09.14
Comments