Backend/Spring Boot

[Spring/JUnit] DataJpaTest에서 JPAQueryFactory Bean 등록 에러 : No qualifying bean of type 'com.querydsl.jpa.impl.JPAQueryFactory' available

giraffe_ 2024. 8. 8. 11:55

Spring에서 JPA와 QueryDSL을 사용하여 DB에서 데이터를 조회하고 있었다.

그리고 Repository 테스트를 진행하는데 에러가 났다.

 

 

 

 

 

💻 개발 환경


  • Framework : Spring Boot `3.2.3`
  • DB : MySQL, H2
  • Library : JPA, QueryDSL `5.0.0`
  • Test : JUnit

 

 

 

 

 

❗️에러 메시지


Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'XXXCustomRepositoryImpl' defined in file [.../repository/XXXCustomRepositoryImpl.class]: Unsatisfied dependency expressed through constructor parameter 0: No qualifying bean of type 'com.querydsl.jpa.impl.JPAQueryFactory' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}

 

 

 

 

 

🔎 원인


UnsatisfiedDependencyException은 Bean 등록이 제대로 이루어지지 않았을 때 발생한다. 메세지를 더 자세히 살펴보면, JPAQueryFactory의 Bean이 등록되지 않았다고 한다.

 

 

 

`@DataJpaTest`로 Repository를 테스트하고 있었다.

@DataJpaTest
class XXXRepositoryTest {
	...
}

 

 

 

`@DataJpaTest`는 Entity와 Repository만 로드하고, QueryDsl 사용을 위한 JPAQueryFactory와 같은 사용자가 별도로 설정한 Bean은 로드되지 않는다. 따라서 JPAQueryFactory의 Bean을 직접 추가적으로 등록해줘야 한다.

 

 

 

 

 

💡 해결


JPAQueryFactory의 Bean을 등록해주기 위해 QueryDSL 설정 클래스를 import 한다.

 

 

  • QueryDSLConfig 클래스
@Configuration
@RequiredArgsConstructor
public class QueryDSLConfig {
    private final EntityManager entityManager;

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

 

 

  • QueryDSL 설정 클래스를 import
@DataJpaTest
@Import(QueryDSLConfig.class) //추가
class XXXRepositoryTest {
	...
}

 

 

 

 

 

 

📖 참고


  • ChatGPT