Basic#5 Component Scan
5. Component Scan
1. Component
앞선 예제들에서 설정 파일(Config.class) 을 이용하여 spring container가 bean을 만들고 DI를 수행했었다. 하지만 실제 프로젝트에서는 수많은 객체, Bean이 생성되고 관리되어야 하는 만큼 설정 파일에 이를 모두 관리하는 것은 어렵고 또 번거롭다.
이를 위해서 spring은 Component Scan을 도입했다. Component scan은 이름처럼 각 객체들을 component로 보고 이들을 container가 찾아 bean으로 등록하고 DI까지 자동으로 진행해주는 기술로 개발자들의 편의를 향상시킨다.
2. @Component
그렇다면 어떻게 container가 객체들을 찾아 bean으로 등록할까? 바로 Annotation을 이용해서 힌트를 제공한다. 예를 들어, @Repository
, @Service
, @Controller
, @Configuration
을 통해 해당 객체가 어떤 역할을 하는지 알 수 있으며, 이 annotation들의 정의를 따라가면 @Component
로 정의되어 있다. 즉, 4종류의 객체가 Container 측면에서 모두 component로 다뤄지고 component scan을 진행할 때 이들을 찾아 bean으로 등록한다.
@Component
public @interface Service { // -> @Service
3. Bean 등록
Spring boot를 사용하면 기본으로 제공되는 메인 메소드에 @SpringBootApplication
annotaion이 붙는데 이 정의를 따라가면 @ComponentScan
이 붙어있는 것을 확인할 수 있다. 해당 annotation을 중심으로 scan이 시작되며 앞서 얘기한 Component들을 찾아 bean으로 생성한다.
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
...
}
4. DI
Component scan을 통해 Bean을 생성하는 방법까지는 이해했다. 하지만 어떻게 DI를 수행할까? 기존 설정파일에서는 new
를 통해 개발자가 원하는 모듈로 DI를 할 수 있었다. 이 또한 spring에서는 annotation을 통해 수행한다. @Component
를 선언한 클래스의 생성자 위에Autowired
라는 annotation을 기재하면 container는 이에 힌트를 받아 해당 생성자를 기반으로 DI를 수행한다.
@Service
public class MemberServiceImpl implements MemberService {
...
@Autowired
public MemberServiceImpl(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
...
🛠 계속 업데이트 필요
2022.03.30 최초 작성
Author And Source
이 문제에 관하여(Basic#5 Component Scan), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@dev2danis/Spring-Basic5-Component-Scan저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)