ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Querydls과 JPQL의 차이
    JPA/Querydsl 2023. 8. 12. 22:28
    @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);
    }

    테스트코드에서 @BeforeEach로 초기 데이터들을 만들어주고 시작하겠다.

     

     

     

    - 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");
    }

    JPQL은 이미 충분히 아는 내용이기 때문에 별도의 설명은 생략하겠다.

     

     

     

     

    - Querydsl 사용시

    @Test
    public 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");
    }

    JpaQueryFactory를 만들 때 생성자에 entity manager를 넘겨준다. 그리고 QMember를 별칭을 하나 만들어서 생성한다. 이후에 queryFactory.select()~~~ 등으로 코드를 짜면 된다. JPQL과 달리 파라미터 바인딩을 하지 않아도 된다는 특징이 있다. m.username.eq("member1")를 보면 파라미터 바인딩을 수동으로 하지 않아도 직접 해준다. 

     

     

    Querydsl의 장점은 string안에 쿼리문을 날리는 것이 아니기때문에 오타가 나도 컴파일 시에 잡아준다. 쿼리도 자바 코드로 작성한다는 것이 큰 장점이다.

     

     

     

     

    JPAQueryFactory의 보통 사용법

    @Repository
    public class MemberJpaRepository {
    
        private final EntityManager em;
        private final JPAQueryFactory queryFactory;
    
    
        public MemberJpaRepository(EntityManager em) {
            this.em = em;
            this.queryFactory = new JPAQueryFactory(em);
        }
        .....
    }

    이 방식은 @RequiredArgsConstructor 사용 불가

     

     

    @SpringBootApplication
    public class QuerydslApplication {
    
    	public static void main(String[] args) {
    		SpringApplication.run(QuerydslApplication.class, args);
    	}
    
    	@Bean
    	JPAQueryFactory jpaQueryFactory(EntityManager em) {
    		return new JPAQueryFactory(em);
    	}
    
    }

    생성자를 직접 안만들고 @RequiredArgsConstructor를 사용하려면 스프링 빈으로 등록해주면 된다.

     

     

     

     

    Q-Type

    QMember m = new QMember("m");

    이렇게 별칭을 줬었는데 이거보다 효율적인 방법이 있다.

     

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

    QMember.member로 받아온다음에 static import를 하면

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

    이렇게 된다.

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

    Querydsl - 서브 쿼리  (0) 2023.08.13
    Querydsl - 조인  (0) 2023.08.13
    Querydsl - 정렬과 페이징, 집합  (0) 2023.08.12
    Querydsl - 검색(select)과 결과 조회  (0) 2023.08.12
    Querydls의 기본 설정  (0) 2023.08.12
Designed by Tistory.