본문 바로가기
MSA

allow-bean-definition-overriding

by xogns93 2024. 12. 11.

allow-bean-definition-overriding는 Spring Framework에서 사용되는 설정으로, 빈 정의 덮어쓰기를 허용할지 여부를 설정합니다. 이 설정은 주로 Spring 애플리케이션의 application.properties 또는 application.yml 파일에서 구성되며, 여러 @Bean 정의가 있을 때 하나의 빈 정의가 다른 빈 정의를 덮어쓰는 것을 허용할지 여부를 제어합니다.

1. 기본 동작 (기본값)

기본적으로, Spring은 빈 정의 덮어쓰기를 허용하지 않습니다. 즉, 같은 이름을 가진 두 개 이상의 빈이 정의되면 애플리케이션이 시작될 때 예외가 발생합니다. 이는 빈 이름의 충돌을 방지하고 의도치 않은 동작을 막기 위한 안전 장치입니다.

2. allow-bean-definition-overriding 설정

allow-bean-definition-overriding 속성을 true로 설정하면, 동일한 빈 이름을 가진 두 개 이상의 빈 정의가 있을 경우 후속 빈 정의가 이전 빈 정의를 덮어쓰게 됩니다. 이 설정은 주로 테스트나 특수한 설정이 필요한 경우에 사용됩니다.

3. 설정 방법

1) application.properties 파일에서 설정

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

2) application.yml 파일에서 설정

spring:
  main:
    allow-bean-definition-overriding: true

4. 예시

두 개의 @Bean 정의가 같은 이름을 가질 때, allow-bean-definition-overridingtrue로 설정하면 후속 빈이 첫 번째 빈을 덮어씁니다.

예시 1: 덮어쓰기 허용 (allow-bean-definition-overriding=true)

@Configuration
public class AppConfig {

    @Bean
    public MyService myService() {
        return new MyService("Original Service");
    }
}

@Configuration
public class AnotherConfig {

    @Bean
    public MyService myService() {
        return new MyService("Overridden Service");
    }
}

위의 경우, allow-bean-definition-overridingtrue로 설정하면, AnotherConfig에서 정의된 myService() 메서드가 AppConfig에서 정의된 myService() 메서드를 덮어쓰게 됩니다. 즉, myService 빈은 "Overridden Service" 값을 가진 MyService 객체가 됩니다.

예시 2: 덮어쓰기 거부 (allow-bean-definition-overriding=false, 기본값)

@Configuration
public class AppConfig {

    @Bean
    public MyService myService() {
        return new MyService("Original Service");
    }
}

@Configuration
public class AnotherConfig {

    @Bean
    public MyService myService() {
        return new MyService("Overridden Service");
    }
}

위와 같이 설정된 경우 allow-bean-definition-overridingfalse로 설정되어 있거나, 기본값을 사용하면, 두 번째 빈 정의가 충돌하여 애플리케이션이 시작될 때 예외가 발생합니다.

5. 언제 사용할까?

allow-bean-definition-overridingtrue로 설정할 때는 다음과 같은 경우가 있을 수 있습니다:

  • 모듈화된 애플리케이션에서 외부 라이브러리나 구성 요소에서 정의된 빈을 수정하거나 덮어쓸 필요가 있을 때.
  • 테스트 환경에서, 특히 @TestConfiguration과 같은 테스트용 구성에서 기존 빈을 재정의할 필요가 있을 때.

하지만, 빈 덮어쓰기는 예기치 않은 동작을 유발할 수 있으므로, 사용 시 주의가 필요합니다.

6. 참고

Spring 5 이후로는 이 설정이 기본적으로 false로 설정되어 있습니다. 이는 빈 이름 충돌을 방지하기 위한 안전 장치로, 실제로 빈을 덮어쓰는 것은 매우 드물게 필요한 경우에만 사용해야 합니다.

'MSA' 카테고리의 다른 글

폴백(Fallback)  (0) 2024.12.13
Resilience4j  (0) 2024.12.13
@ConfigurationProperties  (0) 2024.12.11
리프레시 스코프(Refresh Scope)  (0) 2024.12.11
HashiCorp의 Vault (+raft)  (0) 2024.12.11