문제
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException at ConstructorResolver.java:804
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException at DefaultListableBeanFactory.java:2207
QueryDSL을 사용하기 위해 config 파일을 작성했다.
build를 할 때마다 위와 같은 오류가 발생했다.
원인 분석
@Configuration
public class QueryDslConfig {
@PersistenceContext
private EntityManager entityManager;
@Bean
public JPAQueryFactory jpaQueryFactory() {
return new JPAQueryFactory(entityManager);
}
}
@Configuration
@EnableJpaAuditing
public class PersistenceConfig {
}
dsl을 사용 중인 repositoryImpl에서 JpaQueryFactory부분에서 문제가 있다며 알려주고 있었다.
그렇다고 config를 삭제하면, bean으로 등록되지 않으니 private final 키워드를 이용할 수 없다.
임시로 해당 repository 안에서만 persistence 등록을 하면, 다른 곳에서는 query dsl을 사용할 때마다 똑같이 해야 한다.
모든 곳에서 편하게 사용할 수 있게 설정 파일을 등록하고 빈으로 설정하는 것이 더 좋아보였다.
다른 사람과 config 내용과 gradle을 모두 비교해보았고, 모두 똑같은데 나만 저런 오류가 발생했다.
임시 조치를 하는 것보다 제대로 하는 것에 초점을 두고 찾아보다가 튜터님을 찾아갔다...ㅠ
해결
정말 간단했지만 쉽게 놓칠 수 있던 것이 문제였다. 바로 테스트 코드
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class UserRepositoryTest
DataJpaTest를 작성한 내역이 있었는데, repository 테스트 코드를 작성하게 되면, 사용하고 있는 설정 파일을 모두 가져와야 한다. Jpa에서 사용하고 있는데, DataJpaTest에 들어있지 않으면 그 Bean을 찾지 못하는 것이었다.
@DataJpaTest
@Import(QueryDslConfig.class)
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class UserRepositoryTest
Import를 이용해 위에서 작성한 config를 포함 시켰다.
문제 없이 build에 성공한 모습을 볼 수 있다.
DataJpaTest와 같이 Spring을 직접 띄워야 하는 통합 테스트를 작성할 때도 SpringBootTest가 제대로 동작하기 위해서 import를 해야 한다.
Controller를 테스트하기 위해서는 WebMvcTest로 Web을 대신하고,
Repository 테스트를 위한 DataJpaTest는 Jpa에서 사용하는 설정을 함께 가져와야 동작한다.
각 기능이 제대로 동작하는지 테스트하는 과정은 동작에 필요한 것이 모두 필요하다는 것을 다시 한 번 알게 되었다.
'etc > error' 카테고리의 다른 글
[Spring] try-catch에서 SQLException이 잡아지지 않을 때 해결 (0) | 2025.02.12 |
---|---|
[IntelliJ] 프로젝트 생성 중 오류 -No locally installed toolchains (0) | 2025.01.27 |
[JS] Uncaught ReferenceError: ... is not defined 오류 해결 방법 (0) | 2024.12.27 |