ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 중복 등록과 충돌
    spring/스프링 핵심 원리 강의 내용 정리 2023. 12. 9. 23:12

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

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

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

     

    실험해 보자

    두 서비스 구현체에 service라는 동일한 이름을 주었다

     

    에러가 나는 모습

    아래는 오류 메시지의 일부다

    Annotation-specified bean name 'service' for bean class

    어노테이션인 '서비스'가 문제를 일으켰다고 한다

     

    확인했으면 다시 원상 복구...

     

    이와같이 자동 빈 등록 vs 자동 빈 등록의 이름이 같은 경우는 잘 경험할 일이 없을 것이다

    하지만 수동 빈 등록 vs 자동 빈 등록의 경우는 종종 나온다고 한다

     

    MemoryMemberRepository 에도 @Component 가 붙어있다

    스프링 빈에 등록이 될 땐 첫글자를 소문자로 변경하여 memoryMemberRepository 로 등록 된다는 걸 이전에 설명했다

    AutoConfig에 @Bean 으로 같은 이름인 memoryMemberRepository 라는 이름으로 스프링 빈을 등록해 보자

     

    그리고 AutoAppConfigTest를 실행해 보자

     

     

    같은 이름의 스프링 빈임에도 불구하고 성공해 버리는 모습

     

    수동 빈 등록 vs 자동 빈 등록
    - 이 경우 수동 빈 등록이 우선권을 가진다 (수동 빈이 자동 빈을 오버라이딩 해버린다)

    수동 빈 등록시 남는 로그
    - Overriding bean definition for bean 'memoryMemberRepository' with a different 
     definition: replacing

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

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

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

     

    마지막 줄에 overriding=true 부분이 핵심인데, 이 값이 기본값이 false로 되어있다
    만약 수동 vs 자동 빈 충돌에서 에러가 아닌 오버라이딩을 허용하고 싶다면 저 문구를 복사하여
    application.properties 에 붙혀 넣으면 된다
    (spring.main.allow-bean-definition-overriding=true)

     

     

Designed by Tistory.