티스토리 뷰

반응형

이번 글에서는 QueryDSL 을 사용하기 위해 매번 CustomRepositoryImpl이 번거로워 테스트 클래스에서 사용하는 방법을 보여드리고, 거기에서 잘 수행되는지 확인해볼까 합니다.

가장 먼저 테스트 클래스를 만들어야겠죠. 테스트 클래스를 생성합니다.

QueryDSLTest.java

@SpringBootTest
@Transactional(realOnly = true)
public class QueryDSLTest {
 
    @Autowired // 원래는 @PersistenceContext 을 많이 썼는데, 이제는 오토와이어도 잘됩니다.
    private EntityManager em;
    
    @BeforeEach // 기본적으로 테스트가 시작하기 전에 실행하는 함수
    void createTest() {
        
    }
    
    @Test // 실제 테스트 함수
    void entityManagerTest() {
        
    }

}

그리고 아래에 테스트 클래스에서 쓸 EntityManager 가 잘 작동하는지 체크합니다.

@SpringBootTest
@Transactional(realOnly = true)
public class QueryDSLTest {
 
    @Autowired // 원래는 @PersistenceContext 을 많이 썼는데, 이제는 오토와이어도 잘됩니다.
    private EntityManager em;
    
    @BeforeEach // 기본적으로 테스트가 시작하기 전에 실행하는 함수
    void createTest() {
        
    }
    
    @Test // 실제 테스트 함수
    void jpqlTest() {
        List<Member> members = em.createQuery("select m from Member m", Member.class)
             .fetch();
             
        assertThat(members.size() > 0).isTrue();
    }

}

 

JPAQueryFactory 추가하기

이번에는 QueryDSL을 사용하기 위한 내용을 추가해보겠습니다. 

@SpringBootTest
@Transactional(realOnly = true)
public class QueryDSLTest {
 
    @Autowired // 원래는 @PersistenceContext 을 많이 썼는데, 이제는 오토와이어도 잘됩니다.
    private EntityManager em;
    
    private JPAQueryFactory queryFactory;
    
    @BeforeEach // 기본적으로 테스트가 시작하기 전에 실행하는 함수
    void createTest() {
        queryFactory = new JPAQueryFactory(em);
    }
    
    @Test // 실제 테스트 함수
    void jpqlTest() {
        List<Member> members = em.createQuery("select m from Member m", Member.class)
             .fetch();
             
        assertThat(members.size() > 0).isTrue();
    }

    @Test // QueryDSL Test
    void useQueryDSLTest() {
        QMember member = new QMember("m1");
        List<Member> members = queryFactory.select(member)
                                           .from(member)
                                           .fetch();
             
        assertThat(members.size() > 0).isTrue();
    }
}

 

JPAQueryFactory 직접 접근하기

아래처럼 사용 가능합니다.

@SpringBootTest
@Transactional(realOnly = true)
public class QueryDSLTest {
 
    @Autowired
    private JPAQueryFactory queryFactory;
    
    @Test // QueryDSL Test
    void useQueryDSLTest() {
        QMember member = new QMember("m1");
        List<Member> members = queryFactory.select(member)
                                           .from(member)
                                           .fetch();
             
        assertThat(members.size() > 0).isTrue();
    }
}

대신 위와같이 사용하기 위해서는 Bean 등록을 하여야 하므로 저의 경우 보통 Config 파일을 생성해줍니다.

@Configuration
@EnableJpaAuditing
public class JPAConfig {

    @PersistenceContext
    private EntityManager entityManager;


    @Bean
    public JPAQueryFactory queryFactory() {
        return new JPAQueryFactory(entityManager);
    }

}

 

반응형
댓글
공지사항