Jpa를 사용하는 프로젝트 진행중 검색기능 구현을 위해 ElasticSearch를 추가하면서 발생
Description:
The bean 'DiaryDocumentRepository' could not be registered. A bean with that name has already been defined and overriding is disabled.
Action:
Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true
기존구조는 ElasticSearchRepository 와 JPARepository를 사용하는 레포 구분없이 한 패키지에 작성해두었엇다.
충돌 LOG 를 확인하고 또 ElasticRepository를 작성 이후에 충돌이나고 어플리케이션이 빌드가 되지않았기에 Repository 문제로 인식하고 해당 문제가 발생하는 원인을 찾아보았다.
위 문제의 원인은 JPA Repository 범위를 다른 Repository를 사용하는 어노테이션 과 함깨사용할때 Repository 에 대해 등록하기위해 중복 등록 시도를했기에 발생하였습니다. (필자의 경우 JPARepository ,ElasticSearchRepository)
Spring Data JPA는 따로 설정(BasePackage 등 ) 이없을경우 @SpringbootApplication 시작부터 @Repository가 작성된 모든 클래스를 scan 하게됩니다.
그이후 ElasticSearch 또한 이미 JPA Repository 로 등록된 빈을 또다시 재등록 하려하기 때문에 발생 (위의경우 DiaryDocumentRepository)
JPA만 사용하는 패키지와 Ealstic을 사용하는 패키지를 구분하고 각각 선언된 Config 에 직접 scan할 패키지 범위를 지정해 주었습니다.
@EnableJpaAuditing
@Configuration
@EnableJpaRepositories(basePackages = {RDS_PACKAGE})
public class JpaConfig {
static final String RDS_PACKAGE = "custom.repository.jpa";
}
@Configuration
@EnableElasticsearchRepositories(basePackages = {ELASTIC_DOMAIN_PACKAGE})
public class ElasticSearchConfig extends AbstractElasticsearchConfiguration {
@Value("${elasticsearch.host}")
private String host;
@Value("${elasticsearch.index.diary}")
private String diaryIndex;
static final String ELASTIC_DOMAIN_PACKAGE = "custom.repository.elastic";
public String getDiaryIndex() {
return this.diaryIndex;
}
@Override
public RestHighLevelClient elasticsearchClient() {
ClientConfiguration clientConfiguration = ClientConfiguration.builder()
.connectedTo(host)
.build();
return RestClients.create(clientConfiguration).rest();
}
}
[DynamoDB] Spring Data DynamoDB와 JPA 함께 적용후 문제 발생시 해결방법-jojodol