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