지금까지는 Test 코드로만 QueryDs을 사용했는데 실제 Repository에서 사용해보려 한다 .
비교를 위해 JPQL로 만든 repository 메서드와 querydsl로 만든 메서드를 비교해보자
먼저 리파지토리에 JPAQueryFactory를 등록하는 2가지 방법을 알아보자
1. 생성자에서 직접 생성하여 주입
@Repository
public class MemberJpaRepository {
private final EntityManager em;
private final JPAQueryFactory queryFactory;
public MemberJpaRepository(EntityManager em) {
this.em = em;
this.queryFactory = new JPAQueryFactory(em);
}
- repository의 맨 부분만 따왔다 .
- 생성자에서 직접 생성하여 주입해주는 방식이다 .
2.빈으로 등록하여 Spring DI를 통해 주입 받음
@SpringBootApplication
public class StudyApplication {
public static void main(String[] args) {
SpringApplication.run(StudyApplication.class, args);
}
@Bean
JPAQueryFactory jpaQueryFactory(EntityManager em){
return new JPAQueryFactory(em);
}
}
실행 클래스나 Util용 Config 클래스를 만들든 @Bean으로 등록해 주면된다. 파라미터로 EntityManager를 받으면
EntityManager도 bean이기 때문에 스프링이 주입 해준다.
@Repository
@RequiredArgsConstructor
public class MemberJpaRepository {
private final EntityManager em;
private final JPAQueryFactory queryFactory;
롬복의 @RequiredArgsConstructor와 함께 생성자 주입을 받을 수 있어 코드가 좀더 깔끔하다 .
JPQL로 만든 메서드
public List<Member> findAll(){
return em.createQuery("select m from Member m",Member.class).getResultList();
}
public List<Member> findByUsername(String username){
return em.createQuery("select m from Member m where m.username = : username",Member.class)
.setParameter("username", username)
.getResultList();
}
- JPQL은 문자열로 만들어 지기 때문에 오류가 있을시에 IDE에서 오류에 밑줄을 그어 주지만 실행을 해보면 실행이 된다 때문에 런타임시에 문제가 발생할 수 있다.
Querydsl로 만든 메서드
public List<Member> findAll_QueryDsl(){
return queryFactory
.selectFrom(member)
.fetch();
}
public List<Member> findByUserName_QueryDsl(String username){
return queryFactory
.selectFrom(member)
.where(member.username.eq(username))
.fetch();
}
- 위에 JPQL로 만든 메서드와 같은 동작을 하는 메서드이다 . 깔끔하다 .
- 하지만 간단한 메서드들 이기 때문에 굳이 QueryDsl 셋팅을 해줘서 사용해야하나 싶기도 하다
- 큰 장점은 자바 코드로 되어있기 때문에 오류가 있을시 컴파일 시점에 잡아준다. (실행이 아예 안된다)
'JPA > QueryDSL' 카테고리의 다른 글
QueryDSL 공부 9 - 동적쿼리 성능 최적화 (Builder 와 where 절 동적쿼리) (0) | 2021.06.20 |
---|---|
QueryDSL 공부 10 - Spring data JPA 에서 QueryDsl활용 (0) | 2021.06.20 |
QueryDSL 공부 7 - 수정 , 삭제 벌크성 쿼리 (0) | 2021.06.19 |
QueryDSL 공부 6 - 동적쿼리 (booleanBuilder) (0) | 2021.06.19 |
QueryDSL 공부 5 - 프로젝션과 결과 반환 (0) | 2021.06.19 |