๐Ÿ“š Study

A bean with that name has already been defined in XXX defined in @EnableElasticsearchRepositories declared on ElasticsearchConfig and overriding is disabled.

date
Jun 2, 2024
slug
elasticsearch-bean-already-defined
author
status
Public
category
๐Ÿ“š Study
tags
ํ”„๋กœ์ ํŠธ
Spring
summary
type
Post
thumbnail
แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2024-06-04 แ„‹แ…ฉแ„’แ…ฎ 5.05.45.png
ย 
notion image
ย 

๋ฌธ์ œ์ƒํ™ฉ

Spring Boot ํ™˜๊ฒฝ์—์„œ spring-data-elasticsearch ์—ฐ๋™์„ ํ•˜๋˜ ์ค‘ ์•„๋ž˜์™€ ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.
ํ•ด์„ํ•˜์ž๋ฉด elasticSuggestionRepository ๋นˆ์ด ์ด๋ฏธ ๋“ฑ๋ก๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜์—ฌ ๋“ฑ๋กํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด์—ˆ๋‹ค.
Description: The bean 'elasticSuggestionRepository', defined in com.dreamypatisiel.devdevdev.elastic.domain.repository.ElasticSuggestionRepository defined in @EnableJpaRepositories declared on DevdevdevApplication, could not be registered. A bean with that name has already been defined in com.dreamypatisiel.devdevdev.elastic.domain.repository.ElasticSuggestionRepository defined in @EnableElasticsearchRepositories declared on ElasticsearchConfig and overriding is disabled.
ย 
ํ•ด๋‹น ๋นˆ์ด ์–ด๋””์„œ ๋“ฑ๋ก๋˜๊ณ  ์žˆ๋Š”์ง€ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ์šฐ์„  ํŒจํ‚ค์ง€ ๊ตฌ์กฐ๋ฅผ ์ •๋ฆฌํ•˜๊ณ  ๊ด€๋ จ ํด๋ž˜์Šค๋ฅผ ์‚ดํŽด๋ณด์•˜๋‹ค.
// ํŒจํ‚ค์ง€ ๊ตฌ์กฐ elastic ใ„ดconfig ใ„ดElasticsearchConfig.java ใ„ดdomain ใ„ดdocument ใ„ดElasticSuggestion.java ใ„ดrepository ใ„ดElasticSuggestionRepository.java
ย 

xxxApplication.java

@SpringBootApplication public class DevdevdevApplication { public static void main(String[] args) { SpringApplication.run(DevdevdevApplication.class, args); } }
ย 

ElasticsearchConfig.java

@Configuration @EnableElasticsearchRepositories(basePackages = {"com.dreamypatisiel.devdevdev.elastic.domain.repository"}) public class ElasticsearchConfig extends AbstractElasticsearchConfiguration { @Value("${elasticsearch.host}") private String host; @Value("${elasticsearch.port}") private String port; @Override public @NonNull RestHighLevelClient elasticsearchClient() { ClientConfiguration clientConfiguration = ClientConfiguration.builder() .connectedTo(host + ":" + port) .build(); return RestClients.create(clientConfiguration).rest(); } @Bean public ElasticsearchOperations elasticsearchOperations(RestHighLevelClient client) { return new ElasticsearchRestTemplate(client); } }
์œ„ configํŒŒ์ผ์˜ @EnableElasticsearchRepositories ๋กœ ์ธํ•ด ๋นˆ์ด ์ค‘๋ณต ๋“ฑ๋ก๋˜๊ณ  ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์˜€๋‹ค.
SpringBoot ์—์„œ๋Š” ์ž๋™์œผ๋กœ @EnableJpaRepositories๊ฐ€ ์„ค์ •๋˜๋Š”๋ฐ, ์ด๋•Œ ๋“ฑ๋ก๋œ ๋นˆ์ด @EnableElasticsearchRepositories์— ์˜ํ•ด ๋˜ ์Šค์บ”๋˜๊ณ  ๋“ฑ๋ก๋  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์•„๋‹๊นŒ ์‹ถ์—ˆ๋‹ค.
ย 
ย 
๋‘ annotation์„ ์‚ดํŽด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด xxxRepositoriesRegistrar๋ฅผ importํ•˜๊ณ  ์žˆ๊ณ , ๊ฐ ํด๋ž˜์Šค๋Š” ๋ชจ๋‘ ๊ณตํ†ต์œผ๋กœ ReposistoryBeanDefinitionRegistrarSupport ๋ฅผ ์ƒ์†๋ฐ›๊ณ  ์žˆ๋‹ค.

JpaRepositoriesRegistrar.class

notion image
notion image

ElasticsearchRepositoruesRegistrar.class

notion image
notion image
ย 
์ฆ‰, @EnableElasticsearchRepositories โ†’ ReposistoryBeanDefinitionRegistrarSupport ์— ์˜ํ•ด ๋“ฑ๋ก๋œ ๋นˆ์ด @EnableJpaRepositories โ†’ ReposistoryBeanDefinitionRegistrarSupport ์— ์˜ํ•ด ๋˜ ๋“ฑ๋ก๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ค‘๋ณต ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋˜ ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค.
ย 

ํ•ด๊ฒฐ

๋นˆ์ด ๋‘ ๋ฒˆ ๋“ฑ๋ก๋˜์–ด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋˜ ๊ฒƒ์ด๋ฏ€๋กœ, ๋นˆ ๋“ฑ๋ก์ด ํ•œ ๋ฒˆ๋งŒ ๋˜๋„๋ก ๋ณ€๊ฒฝํ•˜์—ฌ ํ•ด๊ฒฐํ–ˆ๋‹ค!
@EnableJpaRepositories(excludeFilters = @ComponentScan.Filter( type = FilterType.ASSIGNABLE_TYPE, classes = ElasticSuggestionRepository.class)) @ConfigurationPropertiesScan @EnableJpaAuditing @SpringBootApplication public class DevdevdevApplication {}
@Configuration @EnableElasticsearchRepositories(basePackages = {"com.dreamypatisiel.devdevdev.elastic.domain.repository"}) public class ElasticsearchConfig extends AbstractElasticsearchConfiguration {}
ย 
ย 
ย