[Spring] 06-2. 빈 이름 중복 등록

지찬우·2023년 1월 10일
0

Spring

목록 보기
20/27
post-thumbnail

이 시리즈는 인프런 강의(김영한 님의 ‘스프링 핵심 원리 - 기본편’)로 공부하며 혼자 기록하고, 사람들과도 공유할 수 있도록 작성하는 글이다. 최대한 추가적인 정보는 공식 홈페이지, 문서를 보며 얻을 예정이다.
(개인적인 생각과 이해가 들어가 있기 때문에 저의 ‘무식함’이 있을 수 있습니다😜 혹시라도 이 글을 보게 되시는 분이 계시다면 잘못된 부분 댓글로 많이 알려주시면 너무 감사하겠습니다!!)

GitHub Repository : https://github.com/jcw1031/spring-core-study


빈 중복 등록과 충돌

컴포넌트 스캔을 통해 같은 이름의 빈이 둘 이상 등록되는 경우가 발생할 수 있다. 자동 빈 등록과 자동 빈 등록 사이에 중복이 있을 수 있고, 수동 빈 등록과 사이에 중복이 있을 수 있다. 이 두 가지 상황을 알아보자.

자동 빈 등록 vs 자동 빈 등록 💥

이러한 경우에는 스프링이 ConflictingBeanDefinitionException 예외를 발생한다. 간단하다.

수동 빈 등록 vs 자동 빈 등록 💥

이제는 수동 빈 등록과 자동 빈 등록에서의 충돌하는 경우를 살펴보자. 직접 테스트하여 확인해 보겠다.

AutoAppConfig@Bean을 사용해 이름을 memoryMemberRepository로 하여 수동으로 빈을 등록한다.


이미 자동으로 등록되는 빈 중에서 MemoryMemberRepository가 이름이 memoryMemberRepository로 등록되기 때문에 수동 빈 등록과 자동 빈 등록이 중복된다.


그리고 AutoAppConfigTest 클래스의 basicScan() 테스트를 실행해 보면, 오류가 발생하지 않지만 아래처럼 오버라이딩 되었다는 로그를 확인할 수 있다. 수동 등록한 빈이 자동 등록된 빈을 오버라이딩 했다고 알려준다.

수동 등록 빈이 우선권을 가진다. → 수동 빈이 자동 빈을 오버라이딩

Overriding bean definition for bean 'memoryMemberRepository' with a different definition: replacing [Generic bean: class [woopaca.core.member.MemoryMemberRepository]; ...


우리는 충돌했을 때의 결과를 확인해 보기 위해 의도적으로 중복을 발생시켰다. 하지만 실무에서는 의도적으로 발생시키는 것이 아닌 의도치 않게 설정이 꼬여 중복이 일어날 것이다. 이렇게 되면 매우 잡기 어려운 버그가 발생하게 된다. 그래서 테스트가 아닌 실제 애플리케이션을 실행시키게 되면, 스프링은 오류를 발생시킨다.

CoreApplication을 실행시켰을 때 오류가 발생한다.


참고

src/main/resources 경로의 application.properties 파일(또는 application.yml)은 여러 가지 옵션을 설정하고 제공하는 데 사용되는 파일이다. 해당 파일에 아래의 코드를 추가하면 중복이 일어나도 오류를 발생시키지 않고 오버라이딩 하도록 설정할 수 있다.

// application.properties

spring.main.allow-bean-definition-overriding=true
# application.yml

spring:
	main:
		allow-bean-definition-overriding: true
profile
좋은 개발자가 되자.

0개의 댓글