ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Querydsl - Repository에서 Querydsl 사용하기
    Spring/Querydsl 2022. 3. 26. 16:21
    728x90
    반응형

     

     

    Repository에서 Querydsl 사용하기

     Querydsl을 사용하기 위해서는 JPAQueryFactory가 필요한데 Qeurydsl을 사용하는 Repository에서 주입받을려면 불편하다. 따라서 Config를 생성하여 JPAQueryFactory를 bean으로 등록하고 사용할 Repository에서 생성자 주입받는 것을 추천한다.

     

    @Configuration
    public class JpaConfig {
    
        @Bean
        JPAQueryFactory jpaQueryFactory(EntityManager em) {
            return new JPAQueryFactory(em);
        }
    }

     

     참고로 동시성 문제는 문제가 없다. 스프링이 주입해주는 EntityManager는 실제 동작 시점에 진짜 EntityManager를 찾아주는 proxy용 EntityManager이다. 실제 사용 시점에서 트랜잭션 단위에 있는 EntityManager를 주입받아 영속성 컨텍스트를 사용하기 때문에 동시성 문제는 발생하지 않는다.

     

     

    Querydsl 사용하기

     

    @Repository
    @RequiredArgsConstructor
    public class MemberQuerydslRepository {
    
        private final JPAQueryFactory queryFactory;	// (1)
    
        public List<Member> findAll() {
            return queryFactory
                    .selectFrom(member)
                    .fetch();
        }
    
        public List<Member> findByUsername(String username) {
            return queryFactory
                    .selectFrom(member)
                    .where(member.username.eq(username))
                    .fetch();
        }
    }
    • (1) : Qeurydsl을 사용하기 위해 필요한 JPAQueryFactory 생성자 주입

     

    순수 JPA Repository와 비교

     

    순수 JPA Repository findAll 메서드

    public List<Member> findAll() {
            return em.createQuery("select m from Member m", Member.class)
                    .getResultList();
    }

     

    Querydsl Repository findAll 메서드

    public List<Member> findAll() {
        return queryFactory
                .selectFrom(member)
                .fetch();
    }

     

     

    순수 JPA Repository findByUsername 메서드

    public List<Member> findByUsername(String username) {
            return em.createQuery("select m from Member m where m.username=:username", Member.class)
                    .setParameter("username", username)
                    .getResultList();
    }

     

    Querydsl Repository findByUsername 메서드

    public List<Member> findByUsername(String username) {
        return queryFactory
                .selectFrom(member)
                .where(member.username.eq(username))
                .fetch();
    }

     

    728x90
    반응형

    댓글

Designed by Tistory.