본문 바로가기

개인적으로 공부한 것을 정리해 놓은 블로그입니다 틀린 것이 있으면 댓글 부탁 드립니다!


JPA/QueryDSL

QueryDSL 공부 8 - Repository에서 활용

반응형

지금까지는 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 셋팅을 해줘서 사용해야하나 싶기도 하다

- 큰 장점은 자바 코드로 되어있기 때문에 오류가 있을시 컴파일 시점에 잡아준다. (실행이 아예 안된다)

 

반응형