[Spring] 6-4. 중복 등록과 충돌

송광호·2024년 1월 5일

[Spring]

목록 보기
27/41
post-thumbnail

Spring 시리즈는 혼자 공부하며 기록으로 남기고, 만약 잘못 학습 한 지식이 있다면 공유하며 피드백을 받고자 작성합니다.
스프링에 대해 깊게 공부해보고자 인프런의 김영한 강사님께서 강의를 진행하시는 (스프링 핵심 원리 - 기본편) 강의를 수강하며 정리하는 글입니다.
혹여나 글을 읽으시며 잘못 설명된 부분이 있다면 지적 부탁드리겠습니다.


중복 등록

  • 앞에서 @Autowired 애노테이션을 사용할때 가졌던 의문점이 있다.
  • 바로 이름이 같은 빈 즉 중복 등록이 발생된다면 어떻게 될 것인가 였다.
  • 먼저 중복 등록은 다음과 같은 두가지의 상황이 존재한다.
    • 자동 빈 등록 vs 자동 빈 등록
    • 수동 빈 등록 vs 자동 빈 등록

자동 빈 등록 vs 자동 빈 등록

  • 컴포넌트 스캔에 의한 자동 빈 등록시 중복되는 이름이 발견된다면 스프링은 예외를 발생시킨다.
    • ConflictingBeanDefinitionException 발생
  • 실제로 MemberServiceImpl, OrderServiceImpl@Component애노테이션에 "service" 라는 이름을 추가해서 실행시켜보면 예외가 발생한다.
@Component("service")
public class OrderServiceImpl implements OrderService {}

@Component("service")
public class MemberServiceImpl implements MemberService {}

수동 빈 등록 vs 자동 빈 등록

  • 만약 자동 빈 등록이 되어있는 설정 파일이 있는데 어떤 개발자가 수동으로 빈을 등록해버린다면?
@Component
public class MemoryMemberRepository implements MemberRepository {}
@Configuration
@ComponentScan(
        excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)
)
public class AutoAppConfig {
    @Bean(name = "memoryMemberRepository")
    MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }
}
  • 테스트를 돌려보게 되면 테스트는 성공하겠지만 로그메세지를 추적해서 들어가보면 다음과 같은 로그가 남은걸 볼 수 있다.
    Overriding bean definition for bean 'memoryMemberRepository' with a different definition: replacing
  • 그렇다 수동으로 등록된 빈이 우선권을 가지고 오버라이딩 되어버린다.
  • 여러 설정들이 꼬여서 이런 결과가 만들어지는 경우가 많다. 그러면 정말 잡기 어려운 버그가 만들어지는데 이러한 버그는 항상 잡기 어려운 버그다.

그럼 스프링에서는 버그를 어떻게 해결하는데?

  • CoreApplication을 실행해보자
    • The bean 'memoryMemberRepository', defined in class path resource
  • 이미 정의되어있다고 알려준 뒤 서비스를 정지시킨다.
  • 스프링에서는 기본적으로 수동으로 중복 등록할 수 있는 기능이 false로 설정되어있어서 변경하고 싶으면 application.properties에 다음과 같은 내용을 추가하자
    • spring.main.allow-bean-definition-overriding=true
    • 근데 어지간하면 하면 안된다.

0개의 댓글