[스프링 핵심원리] - 5.컴포넌트 스캔 (3)

Chooooo·2022년 11월 5일
0
post-thumbnail

이 글은 강의 : 김영한님의 - "스프링 핵심원리 - 기본편"을 듣고 정리한 내용입니다. 😁😁


이번에는 중복 등록과 출돌에 대해 공부할 것이다.

자동 등록과 충돌

자동 빈 등록 vs 자동 빈 등록

컴포넌트 스캔에 의해 자동으로 스피링 빈이 등록되었는데, 이름이 같은 경우 스프링은 ConflictingBeanDefinitionException 예외 발생시킨다.

예시

MemberServiceImpl와 OrderServiceImpl의 빈이름을 Service로 수정
예외가 발생하는 것을 확인하고자 빈 이름을 같게 수정한다. (테스트 후에는 원상 복귀해야함)

package hello.core.member;

@Component("service")
public class MemberServiceImpl implements MemberService{
...
}
package hello.core.order;

@Component("service")
public class OrderServiceImpl implements OrderService{
...
}

AutoConfigTest를 실행한 후 결과는 역시 오류 !!

수동 빈 등록 vs 자동 빈 등록

AutoAppConfig 수동 빈 등록
AutoAppConfig에 빈 이름이 moemoryMemberRepository 인 빈을 수동으로 등록한다.

package hello.core;

@Configuration
@ComponentScan(
        excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)
)
public class AutoAppConfig {

    // 빈 이름이 memoryMemberRepository 인 수동 빈 등록
    @Bean(name = "memoryMemberRepository")
    MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }
}

수동 빈 등록시 남는 로그 (AutoAppConfigTest 실행 결과)

  • 수동 빈 등록과 자동 빈 등록에서 빈 이름이 같을 경우, 수동 빈 등록이 우선권을 가진다. (수동 빈이 자동 빈을 오버라이딩 해버린다.)

물론 개발자가 의도적으로 이런 결과를 기대했다면, 자동 보다는 수동이 우선권을 가지는 것이 좋다. 하지만 현실은 개발자가 의도적으로 설정해서 이런 결과가 만들어지기 보다는 여러 설정들이 꼬여서 이런 결과가 만들어지는 경우가 대부분이다! 그러면 정말 잡기 어려운 버그가 만들어진다. 항상 잡기 어려운 버그는 애매한 버그다. 그래서 최근 스프링 부트에서는 수동 빈 등록과 자동 빈 등록이 충돌나면 오류가 발생하도록 기본 값을 바꾸었다.

정리하면 자동 vs 자동은 기본으로 예외 발생 (중복!)
수동 vs 자동이면 수동이 우선(overriding)

profile
back-end, 지속 성장 가능한 개발자를 향하여

0개의 댓글