TIL

209일차(모험 118일차) - 중복 등록과 충돌

haedal-uni 2022. 4. 11. 23:14
728x90

- spring 강의

- 이론 정리 복습

 

[add] 중복 등록과 충돌 [#28] #31

컴포넌트 스캔에서 같은 빈 이름을 등록하면 어떻게 될까? 아래 두가지 상황이 있다.

1. 자동 빈 등록 vs 자동 빈 등록

2. 수동 빈 등록 vs 자동 빈 등록

 

 

 

자동 빈 등록 vs 자동 빈 등록

 

컴포넌트 스캔에 의해 자동으로 스프링 빈이 등록되는데, 그 이름이 같은 경우 스프링은 오류를 발생시킨다.

ConflictingBeanDefinitionException 예외 발생

 

 

 

service라는 이름 추가

 

OrderServiceImpl

 

 

MemberServiceImpl

 

 

service를 붙인 후에 AutoAppConfigTest를 실행시키면 충돌이 난다.

 

 


수동 빈 등록 vs 자동 빈 등록

 

MemoryMemberRepository를 보면 Component가 등록되어있다.

 

💡Component 이기 때문에

MemoryMemberRepository에서 M이 소문자 m으로 바뀌어서

memoryMemberRepository가 된다.

 

 

 

 

이것을 이름을 똑같이 해서 AutoAppConfig에 등록하는 것이다.

 

 

⬇️

public class AutoAppConfig { 
    
    // 중복 등록과 충돌
    @Bean(name = "memoryMemberRepository")
    MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }

 

이름을 memoryMemberRepository라고 작성한 이유는 바로 위 💡 표시 확인

 

 

이제 AutoAppConfigTest를 실행해본다. 결과는 성공한다.

같은 이름인데 성공한 이유는 ?

 

이 경우 수동 빈 등록이 우선권을 가진다.

(수동 빈이 자동 빈을 오버라이딩 해버린다.)

 

 

 

수동 빈 등록시 남는 로그

 

Overriding bean definition for bean 'memoryMemberRepository' with a different definition: replacing

 

 

 

수동 빈 등록, 자동 빈 등록 오류시 스프링 부트 에러

스프링 부트인 CoreApplication 을 실행해보면 오류를 볼 수 있다.

 

memoryMemberRepository가 AutoAppConfig에 등록되어있다. ~~~

 

 

Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true

 

 

 

최근 스프링 부트에서는 수동 빈 등록과 자동 빈 등록이 충돌나면 오류가 발생하도록 기본 값을 바꾸었다.

* 기본값이 false 

 

만약에 오버라이딩 하고 싶으면 application.properties에 

spring.main.allow-bean-definition-overriding=true

코드를 추가한다.

 

 

 

728x90