Basic#5 Component Scan

4740 단어 SpringSpring

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 최초 작성

좋은 웹페이지 즐겨찾기