반응형
문제 상황
- user-service 모듈에서 User Repository 이외에 투자 성향 테스트 도메인 investment_test 을 생성
- investment_test 도메인 내부에 또다른 Repository(Question, Answer) 를 구성했던 상황
`user-service` 어플리케이션은 정상적으로 실행이 되는데 `portfolio-service` 어플리케이션을 실행하면 아래와 같이 에러가 발생하였다.
에러 메세지
2024-06-18T23:59:52.274+09:00 WARN 6146 --- [portfolio-service] [ main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.support.BeanDefinitionOverrideException: Invalid bean definition with name 'portfolioRepository' defined in com.pda.portfolio_service.jpa.PortfolioRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Cannot register bean definition [Root bean: class [org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodNames=null; destroyMethodNames=null; defined in com.pda.portfolio_service.jpa.PortfolioRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration] for bean 'portfolioRepository' since there is already [Root bean: class [org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodNames=null; destroyMethodNames=null; defined in com.pda.portfolio_service.jpa.PortfolioRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration] bound.
***************************
APPLICATION FAILED TO START
***************************
Description:
The bean 'portfolioRepository', defined in com.pda.portfolio_service.jpa.PortfolioRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration, could not be registered. A bean with that name has already been defined in com.pda.portfolio_service.jpa.PortfolioRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration and overriding is disabled.
Action:
Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true
원인
project(':portfolio-service'){
dependencies {
implementation project(':utils')
implementation project(':user-service')
}
}
- 멀티 모듈 구조 상 portfolio-service 모듈이 user-service 모듈을 의존성으로 포함하고 있었다.
- 이 경우 portfolio-service 모듈에서 user-service 모듈의 리포지토리를 스캔하려고 할 수 있다.
그러나 @SpringBootApplication이 선언된 패키지 범위와 다른 모듈의 패키지 범위가 명확히 구분되지 않으면 빈 스캔 및 등록에서 충돌이 발생할 수있다. (@SpringBootApplication어노테이션은 기본적으로 선언된 패키지와 그 하위 패키지만 스캔한다.)
@SpringBootApplication은 @EnableAutoConfiguration, @ComponentScan, @Configuration을 포함하고 있습니다. 그러나 기본적으로 @ComponentScan은 @SpringBootApplication이 선언된 패키지와 그 하위 패키지만 스캔합니다.
따라서, 다른 패키지에 있는 리포지토리를 스캔하지 못할 수 있습니다.
해결 방법
@EnableJpaRepositories를 사용하여 명확한 패키지 스캔 범위를 지정한다.
@EnableJpaRepositories(basePackages = {"com.pda.portfolio_service"})
@SpringBootApplication(scanBasePackages = "com.pda")
public class PortfolioServiceApplication {
public static void main(String[] args) {
SpringApplication.run(PortfolioServiceApplication.class, args);
}
}
@SpringBootApplication(scanBasePackages = "com.pda")
@EnableJpaRepositories(basePackages = {"com.pda.user_service", "com.pda.investment_test"})
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
}
참고
https://batory.tistory.com/463
반응형
'프레임워크 > Spring Boot' 카테고리의 다른 글
[Spring Boot] application 설정 파일에서 민감한 정보 숨기기 (application.properties, application.yml) (1) | 2024.08.15 |
---|---|
[Spring Boot] 프로젝트 초기 설정하기 (Spring Boot, DB, Git) (0) | 2024.07.25 |
[Spring Boot] ExceptionResolver으로 예외 처리하기 (0) | 2024.05.21 |
[Spring Boot] 유효성 검사 with @Valid, @Validated (0) | 2024.05.17 |
[Spring] DO(Entity), DTO (0) | 2024.05.16 |