component-scan 이란?
빈으로 등록 될 클래스들을 스캔하여 빈으로 등록해주는 것이다.
default - @Controller, @Service, @Component, @Repository
기본적으로 @Component 를 빈 등록 대상으로 포함한다.
@Controller , @Service는 어떻게 인식하는 걸까?
@Controller, @Service 가 @Component를 포함하고 있기 때문이다.
1. xml 파일 설정
<context:component-scan base-package="com.example.demo"/>
base-package 기준으로 클래스들을 스캔하여 빈으로 등록한다.
여러개의 패키지를 쓸 수 있다.
ex)
<context:component-scan base-package="com.example.demo, com.example.test"/>
위와 같이 설정하면 base-package 하위의 @Controller, @Service, @Component, @Repository 모두 빈으로 등록된다.
특정한 객체만 등록하고 싶다면 include-filter 혹은 exclude-filter 를 통해 설정할 수 있다.
1) include-filter - 특정 어노테이션만 스캔
<context:component-scan base-package="com.example.demo" use-default="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
use-default="false"
> 기본 어노테이션 @Controller, @Component 등을 스캔하지 않는다는 의미.
이후 include-filter를 통해서 특정 어노테이션만 스캔할 수 있다.
2) exclude-filter - 제외하고 싶은 어노테이션 설정
<context:component-scan base-package="com.example.demo">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
2. Java 파일 설정
@Configuration
@ComponentScan(basePackages = "com.example.demo")
public class ApplicationConfig {
}
@Configuration - xml을 대체하는 설정 파일임을 명시.
@ComponentScan - xml설정에서 사용하는 의미와 동일.
3. component-scan을 사용하지 않을 경우
<bean id="testDAO" class="com.example.demo.TestDAO"></bean>
<!-- MemberList 객체에 대한 정보 전달 및 의존성 주입 -->
<bean id="member" class="com.example.demo.MemberList">
<!-- 속성의 이름을 지정하여 주입 -->
<property name="dao">
<ref bean="testDAO"/>
</property>
</bean>
빈으로 설정할 클래스들을 직접 xml 파일에 각각 등록해 주어야 한다.
TestDAO 와 MemberList 를 빈으로 등록 후 test를 주입한 것이다.
클래스 개별 추가로 인해 코드가 매우 길어지고 복잡해진다.
component-scan 동작 과정
1. ConfigurationClassParse : @Configuration 클래스 파싱.
2. ComponentScan 설정 파싱
> base-package 기준으로 ComponentScanAnnotationParser가 스캔하기 위한 설정 파싱.
3. base-package 설정 기준으로 모든 클래스 로딩.
4. ClassLoader가 로딩한 클래스들을 BeanDefinition으로 정의 : 생성할 빈 정의
5. 생성할 빈에 대한 정의를 토대로 빈을 생성.
* 요즘은 java단에서 @(Annotation)을 이용해 정리하는 추세이지만,
Spring boot가 아닌 Spring MVC 를 사용하는 회사에서는 xml 설정을 주로 이용하여 정리해보았다.
불필요한 xml은 제거하여 사용하자.
'JAVA > Spring' 카테고리의 다른 글
[API] Spring boot + Swagger 3 (SpringDOC, OpenAPI) 적용 및 사용법 (2) | 2023.11.13 |
---|---|
[Spring] JAVA - formData 이용하여 여러 개의 Entity(값/객체) 전송/전달 하기 (0) | 2023.04.12 |
[Spring] Spring boot - application.yml 값 변수로 사용하기 (0) | 2023.01.16 |
[API] Swagger @ApiResponse Multi 사용법 (0) | 2022.12.16 |
[API] Spring boot Swagger 기본 사용법 (2) | 2022.12.15 |