본문 바로가기
Back-end/Spring 개념

10. Bean 자동 vs 수동 등록

by devraphy 2022. 2. 9.

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

댓글