Programming/Study

Querydsl 적용한 Repository에 @DataJpaTest 적용하기

JKROH 2023. 12. 8. 17:22
반응형

 @DataJpaTest를 사용하면 Querydsl이 적용된 Repository가 @Autowired되지 않는다. 기본적으로 @DataJpaTest는 JPA와 관련한 설정만 적용해주기 때문이다.

 

 그러나 Querydsl을 사용하면 JpaRepository에 추가적으로 @Repository 애너테이션을 이용해 Spring Bean으로 등록한 QRepository를 적용시켜줘야 한다. @DataJpaTest는 Bean등록을 하지 않기 때문에 Repository에 적용될 QRepository의 등록이 이루어지지 않고, 따라서 @Autowired도 실패하는 것이다. 그럼 Bean을 등록해주면 해결되지 않을까?

 

 Bean 등록을 위해서는 Configuration을 이용해야 한다. 기본적으로 Spring Context에 Bean등록을 하기 위해서는 @Configuraion 애너테이션을 이용하지만, Test용 Bean을 만들기 위해서는 @TestConfiguration을 사용한다.

@TestConfiguration
public class TestConfig {
    @PersistenceContext
    private EntityManager entityManager;

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

    @Bean
    public FreeBoardCustomRepositoryImpl adminRepository() {
        return new FreeBoardCustomRepositoryImpl(jpaQueryFactory());
    }
}

 

 FreeBoardCustomRepositoryImpl에는 @Repository가 붙어있어 애플리케이션 실행 시에는 알아서 Bean으로 등록되지만, 테스트에서는 직접 등록해줘야한다. 이제 해당 Configuration을 @Import해주자.

@Import(TestConfig.class)
@DataJpaTest
class FreeBoardRepositoryTest {
    ...
}

 

 그런데 앞으로 생길 레파지토리마다 @Import를 따로 붙이기는 좀 귀찮다. 대신 커스텀 애너테이션을 하나 만들자.

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Import(TestConfig.class)
@DataJpaTest
public @interface RepositoryTest {
}

 

 테스트 클래스에 붙일 것이므로 ElemenType 은 TYPE으로 설정했고, 테스트가 실행되는 동안 적용되어야 하기에 RetentionPolicy는 RUNTIME을 사용했다.

 

 참고 자료

- 기억의 정류장님 : [QueryDsl] @DataJpaTest 에서 @Repository 테스트하기

https://rachel0115.tistory.com/entry/QueryDsl-DataJpaTest-%EC%97%90%EC%84%9C-Repository-%ED%85%8C%EC%8A%A4%ED%8A%B8%ED%95%98%EA%B8%B0

 

[QueryDsl] @DataJpaTest 에서 @Repository 테스트하기

개요 프로젝트 진행중에 QueryDsl을 사용하는 CustomRepository를 만들었다. 여러 엔티티를 JOIN하여 데이터를 조회할 예정이였기 때문에 JpaRepository에 상속하지 않고 @Repository 어노테이션을 붙여 스프링

rachel0115.tistory.com

 

반응형