빈 이름이 중복될 경우 서로 충돌이 난다. 그 중 자동 빈 vs 수동 빈의 충돌을 알아보자.
아래처럼 @Component 어노테이션에 의해 자동으로 빈 등록이 되어 memoryMemberRepository 라는 빈이 등록 되었다.
@Component
public class MemoryMemberRepository implements MemberRepository {
private static Map<Long, Member> store = new HashMap<>();
@Override
public void save(Member member) {
store.put(member.getId(), member);
}
@Override
public Member findById(Long memberId) {
return store.get(memberId);
}
}
근데 다른 클래스에서 아래처럼 수동으로 직접 빈을 동일한 이름으로 등록을 해주어버렸다.
@Configuration
@ComponentScan
public class AutoAppConfig {
@Bean("memoryMemberRepository")
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
}
어떻게 될까??? 👀
이 경우 수동 빈 등록이 우선권을 가진다!! 당연히 내가 직접 명시해준게 더 정확하다 판단하지 않을까??
그러므로 아래 테스트코드에서는 수동 빈이 자동 빈을 오버라이딩 해버려서 오류없이 Test코드가 성공이 된다.
public class AutoAppConfigTest {
@Test
void basicScan() {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class);
MemberService memberService = ac.getBean(MemberService.class);
Assertions.assertThat(memberService).isInstanceOf(MemberService.class);
}
}
다만 아래와 같은 로그는 찍힌다. (오류는 아님)
DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Overriding bean definition for bean 'memoryMemberRepository' with a different definition:
하지만 최근 스프링부트에서는 수동 빈 등록과 자동 빈 충돌시 오류가 발생하도록 기본값을 바꾸었다!!
나혼자 개발하면 모르겠지만! 혼자 개발할거 아니지??!!
여러 사람이 함께 개발하는것에는 어떤 버그가 생길지 모르니 사전에 예방차원..!!
그래서 스프링부트 메인 클래스에서 구동을 하면 아래와 같이 이미 빈이 정의되었다는 오류 출력❗❗❗

그래도 수동 빈이 우선권을 가지도록 설정하고 싶다면??
application.properties 파일에 아래처럼 설정해주면 된다!
spring.main.allow-bean-definition-overriding=true
'Spring' 카테고리의 다른 글
조회 빈이 2개 이상일 때 해결방법! (0) | 2022.06.04 |
---|---|
[Springboot] Execution failed for task ':test' 에러 해결방법 (0) | 2022.06.04 |
의존관계가 아닐때 옵셔널처리 (0) | 2022.06.04 |
의존관계 주입방법 (0) | 2022.06.04 |
@ComponentScan 과 @Autowired (0) | 2022.06.04 |
댓글