스프링 기본 - 중복 등록과 충돌
중복 등록과 충돌
컴포넌트 스캔에서 같은 빈 이름을 등록하면 어떻게 될까?
다음 두가지 상황이 있다.
- 자동 빈 등록 vs 자동 빈 등록
- 수동 빈 등록 vs 자동 빈 등록
자동 빈 등록 vs 자동 빈 등록
- 컴포넌트 스캔에 의해 자동으로 스프링 빈이 등록되는데, 그 이름이 같은 경우 스프링은 오류를 발생시킨다.
- @ConflictingBeanDefinitionException 예외 발생
위와 같이 실수로 OrderServiceImpl과 MemberServiceImpl의 스프링 빈 이름을 "service"로 동일하게 설정했다고 가정해보자.
AutoAppConfigTest를 돌려보면,
이렇게 @ConflictingBeanDefinitionException 예외가 발생 한다.
확인했으면 다시 코드를 원상복구하자.
수동 빈 등록 vs 자동 빈 등록
만약 수동 빈 등록과 자동 빈 등록에서 빈 이름이 충돌되면 어떻게 될까?
MemoryMemberRepository는 이미 컴포넌트로 등록을 해둔 상태인데, (스프링빈에 등록될때는 맨앞글자만 소문자로 바뀐 네이밍으로 자동등록된다.)
AutoAppConfig에 수동으로 동일한 이름으로 bean을 등록하고,
AutoAppConfigTest 에서 테스트해보자.
자동으로 등록된 빈과 수동으로 등록된 빈의 이름이 같은데, test를 통과했다.
로그에서 볼 수 있듯,
이 경우 수동 빈 등록이 우선권을 가진다. (수동 빈이 자동 빈을 오버라이딩 해버린다.)
수동 빈 등록시 남는 로그
물론 개발자가 의도적으로 이런 결과를 기대했다면, 자동 보다는 수동이 우선권을 가지는 것이 좋다.
하지만 현실은 개발자가 의도적으로 설정해서 이런 결과가 만들어지기 보다는 여러 설정들이 꼬여서 이런 결과가 만들어지는 경우가 대부분이다! 그러면 정말 잡기 어려운 버그가 만들어진다.
항상 잡기 어려운 버그는 애매한 버그다.
그래서 최근 스프링 부트에서는 수동 빈 등록과 자동 빈 등록이 충돌나면 오류가 발생하도록 기본 값을 바꾸었다.
바로 아래와 같이 스프링 부트로 실행을 해보면,
수동 빈 등록, 자동 빈 등록 오류시 스프링 부트 에러
스프링 부트인 CoreApplication 을 실행해보면 오류를 볼 수 있다
스프링부트가 이 옵션을 기본적으로 False로 한다.
properties에서 이 옵션을 ture로 하고 돌려보면, 스프링빈을 오버라이딩 할 수 있다.
다시 저것을 false로 하면 오류가 난다.
properties에 작성한 코드는 다시 지워주었다. (그러면 기본값 false로 세팅)
'Spring' 카테고리의 다른 글
스프링 기본 - 옵션 처리 (0) | 2022.06.02 |
---|---|
스프링 기본 - 다양한 의존관계 주입방법 (0) | 2022.06.02 |
스프링 기본 - 필터 (0) | 2022.05.31 |
스프링 기본 - 탐색 위치와 기본 스캔 대상 (0) | 2022.05.30 |
스프링 기본 - 컴포넌트 스캔과 의존관계 자동 주입 시작하기 (0) | 2022.05.30 |
댓글
이 글 공유하기
다른 글
-
스프링 기본 - 옵션 처리
스프링 기본 - 옵션 처리
2022.06.02 -
스프링 기본 - 다양한 의존관계 주입방법
스프링 기본 - 다양한 의존관계 주입방법
2022.06.02 -
스프링 기본 - 필터
스프링 기본 - 필터
2022.05.31 -
스프링 기본 - 탐색 위치와 기본 스캔 대상
스프링 기본 - 탐색 위치와 기본 스캔 대상
2022.05.30