강의를 들으며 생각 정리
지금까지 스프링 빈을 등록할 때는 자바 코드의 @Bean이나 XML의 <bean> 등을 통해서 설정 정보에 직접 등록할 스프링 빈을 나열했다. 그러나 등록해야 할 스프링 빈이 수십, 수백개가 되면 일일이 등록하는 작업이 반복될 것이다. 그래서 스프링은 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔이라는 기능을 제공한다. 또 의존관계도 자동으로 주입하는 @Autowired라는 기능도 제공한다.
컴포넌트 스캔
AutoAppConfig.java
@Configuration
@ComponentScan(
excludeFilters = @ComponentScan.Filter(type= FilterType.ANNOTATION,classes = Configuration.class)
)
public class AutoAppConfig {
}
@ComponentScan은 @Component 애노테이션이 붙은 클래스를 스캔해서 스프링 빈으로 등록한다.
각 구현 객체에 @Component 애노테이션을 붙여주고, 의존관계가 필요하다면 구현 객체 생성자 앞에 @Autowired를 붙여주면 된다.
또한 위 코드처럼 원하는 애노테이션에 대해 필터링 역시 지원한다. 그러나 저렇게 옵션을 변경하면서 사용하기 보다는 스프링의 기본 설정에 최대한 맞추어 사용하는 것을 권장한다.
탐색 위치
컴포넌트 스캔은 기본적으로 스캔을 하는 클래스가 속한 패키지 내부를 탐색한다. 탐색 위치는 basePackage 등을 사용하여 직접 지정할 수 있지만 권장하는 방법은 패키지 위치를 지정하지 않고, 설정 정보 클래스의 위치를 프로젝트 최상단에 두어 하위 클래스들을 전부 탐색하게 하는 것이 편리하다.
참고로 스프링 부트를 사용하면 스프링 부트의 대표 시작 정보인 @SpringBootApplication을 이 프로젝트의 시작 루트 위치에 두는 것이 관례이다.(이 설정안에 @ComponentScan이 들어있다.)
컴포넌트 스캔 기본 대상
@Controller, @Service, @Repository, @Configuration 애노테이션 역시 @Component를 포함하고 있다. 사실 애노테이션에는 상속관계라는 것이 없지만 이렇게 애노테이션이 특정 애노테이션을 인식하는 것은 스프링이 지원하는 기능이다.
중복 등록과 충돌
자동 빈 등록 vs 자동 빈 등록 : ConflictingBeanDefinitionException예외 발생
수동 빈 등록 vs 수동 빈 등록 : 순수한 스프링에서는 수동 빈이 우선권을 가진다. 그러나 현실에서는 수동빈, 자동빈 중복을 의도했을 때보다는 여러 설정들이 꼬여서 발생하는 경우가 많다. 그래서 스프링부트에서는 수동 빈, 자동 빈 중복 등록도 자동 빈, 자동 빈 중복 때와 마찬가지로 오류를 발생시킨다.
추가)
컴포넌트 스캔을 사용함으로써 편리함을 얻었지만 애노테이션을 지웠다 썼다 해야하는 번거로움 역시 존재한다. 그래도 객체지향원리는 계속 유지가 되기 때문에 실용적인 관점에서는 컴포넌트 스캔을 주로 사용하고, 정말 유연하게 객체를 변경하고 관리해야 할 때는 수동 빈을 사용하는 것을 권장한다.
'java > spring' 카테고리의 다른 글
[Spring] 빈 생명주기 콜백 (0) | 2021.01.11 |
---|---|
[Spring] 의존관계 자동 주입 (0) | 2021.01.11 |
[Spring] 싱글톤 컨테이너 (0) | 2021.01.08 |
[Spring] 스프링 설정하기, 스프링 컨테이너와 스프링 빈 (0) | 2021.01.08 |
[Spring] 스프링 핵심 원리 이해2 - 객체 지향 원리 적용 (0) | 2021.01.06 |