0. 개요
- 이전 포스팅에서 Bean 자동/수동 등록에 대해 기본적인 것들을 알아보았다.
- 이번 포스팅에서는 Bean 자동 등록과 수동 등록을 동시에 사용할 때 발생할 수 있는 문제점들에 대해 알아보자.
1. Bean 자동 등록과 수동 등록이란?
a) AppConfig를 이용한 Bean 수동 등록
- Bean 수동 등록은 AppConfig 설정 파일에 직접 Bean을 등록하는 방식을 말한다.
@Configuration
public class AppConfig{
@Bean
public TestService testService() {
return new TestServiceImpl(testRepository());
}
}
b) @ComponentScan을 이용한 Bean 자동 등록
- Bean 자동 등록은 @ComponentScan을 통한 Bean 등록을 의미한다.
@ComponentScan
public class TestServiceImpl implements TestService {
private final TestRepository testRepository;
@Autowired
public TestServiceImpl(TestRepository testRepository) {
this.testRepository = testRepository;
}
}
2. Bean 이름 중복으로 인한 충돌
a) 자동 등록 시 Bean 이름 중복
- ComponentScan 과정에서 Bean이름이 중복되는 경우, ConflictBeanDefinitionException이 발생한다.
- 그러므로 반드시 Bean은 고유한 이름을 사용해야 한다.
b) 수동 등록과 자동 등록을 같이 사용하는 경우
- 수동 등록과 자동 등록에서 동일한 Bean이름을 사용하는 경우, 수동으로 등록된 Bean이 우선권을 갖는다.
- 즉, 자동 등록된 Bean의 내용물이 수동 등록된 Bean으로 덮어쓰기가 된다.
- 실제로 빌드를 할 때 Spring 로그를 살펴보면 해당 Bean이 대체(replacing) 되었다는 것을 확인할 수 있다.
c) 수동 등록 vs 자동 등록의 우선권
- 수동 등록은 개발자가 직접 작성한 코드이므로, 자동 등록보다 우선권을 갖는 것을 기본으로 한다.
- 그러나, 실제로는 의도적으로 이와 같은 설정을 하기보단 여러 설정이 얽히면서 이와 같은 상황을 초래하는 경우가 대부분이다.
- 의도와는 다르게 자동 등록된 Bean을 수동 등록된 Bean으로 덮어 씌우는 상황에서 발생한 오류는 디버그 하기 정말 힘들다.
- 모든 것이 잘 돌아가는데 결괏값이 기댓값과 다르기 때문이다.
d) Spring은 수동 등록의 우선권을 막는다.
- 위에서 설명한 오류가 발생하는 일을 예방하기 위해서, Spring은 수동 등록의 우선권을 막아놓았다.
- 즉, 수동 등록된 Bean이 자동 등록된 Bean을 덮어쓰지 못하도록 설정해놓은 것이다. (이를 기본값으로 갖는다)
Consider renaming one of the beans or enabling overriding by setting
spring.main.allow-bean-definition-overriding=true
- 위의 예시는 수동 등록과 자동 등록의 Bean 이름 중복이 발생하는 경우 Spring에서 출력하는 에러 메시지의 한 부분이다.
- 만약 수동 등록의 우선권 사용을 허용하고 싶다면 위의 메시지에서 알려주는 대로 application.properties의 설정을 명시하면 된다.
spring.main.allow-bean-definition-overriding=true
3. 결론
- Bean 자동 등록을 사용하는 것을 권장한다.
- 이 방식이 Spring에서 권장하는 방법이며, Spring이 계속해서 annotation 기반의 개발 방식을 지향하기 때문이다.
'Back-end > Spring 개념' 카테고리의 다른 글
12. Dependency Injection 방법 (0) | 2022.02.11 |
---|---|
11. Dependency Injection 기본개념 (0) | 2022.02.10 |
9. @ComponentScan의 동작원리와 옵션 (0) | 2022.02.08 |
8. Bean 자동 등록 (0) | 2022.02.07 |
7. Singleton Container (0) | 2022.02.02 |
댓글