Spring Annotation
import com.fasterxml.jackson.annotation.JsonIgnore;
@JsonIgnore
@Bean
===== @SpringBootApplication =====
Spring 부팅할 때, 자주 사용되는 어노테이션 조합을 대신하여 간편하게 달 수 있는 어노테이션이다.\
@Configuration과 @EnableAutoConfiguration, @ComponentScan 어노테이션을 단 것과 같이 동작한다.
<code java>
@SpringBootApplication
public class MyBootAppApplication {
public static void main\(String\[\] args\) {
SpringApplication.run\(MyBootAppApplication.class, args\);
}
}
</code>
SpringBootApplication에 붙은 어노테이션을 살펴보자
<code java>
@Target(ElementType.TYPE) // 클래스, 인터페이스, enum 선언부
@Retention(RetentionPolicy.RUNTIME) // VM에서 유지 (리플렉션을 이용하여 검색 가능)
@Documented //해당 어노테이션을 Javadoc에 포함한다.
@Inherited //서브 클래스가 부모 어노테이션을 상속받도록 한다.
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class))
public @interface SpringBootApplication {
...
}
</code>
===@EnableAutoConfiguration===
\* 직역하면 자동 구성을 가능하게 한다는 의미이고,
\* 사용자가 필요로 할 법한 bean들의 configuration을 추측하여 자동 구성을 가능하도록 한다.
\* 일반적으로 사용자의 Class Path와 사용자가 정의한 bean에 기초하여 구성들을 자동 적용합니다.
\* 예외적으로 적용을 원하지 않는 configuration에 대해서는 \#excludeName을 사용하여 제외할 수 있습니다.
\* @EnableAutoConfiguration이 달리는 클래스의 package는 default로 주로 사용되며 중요하게 작동하는데,
\* @Entity Class들을 스캔하는 root package로 동작합니다.
=== @ComponentScan ===
\* @Component가 달린 클래스들을 자동으로 빈 등록하기 위한 스캐너로 동작합니다.
\* 자바의 설정 클래스에 @ComponentScan 어노테이션을 설정하면
\* Bean들을 XML에 직접 등록하지 않아도 클래스의 @Component 어노테이션을 통해 자동으로 빈 등록이 됩니다.
===실질적인 Component scan이 진행되기 까지의 절차 요약===
@Configuration 어노테이션 클래스 파싱
- (보통 @Configuration 설정 클래스에 @ComponentScan이 설정)
@ComponentScan 어노테이션 클래스 파싱
ComponentScanAnnotationParser 클래스
실질적으로Component scan 패키지 디렉토리에서 리소스를 찾는 ClassPathBeanDefinitionScanner
@Configuration은 "이 class가 구성을 알려주는 class다!!" 라는 느낌! 인 것 같다.
각 어노테이션들의 원문 설명
* **@SpringBootApplication** is a convenience annotation that adds all of the following:
* **@Configuration** tags the class as a source of bean definitions for the application context.
* **@EnableAutoConfiguration** tells Spring Boot to start adding beans based on classpath settings, other beans, and various property settings. Technically, Spring Boot doesn’t have anything to auto-configure when it comes to scheduling but a future version might.
* **@ComponentScan** tells Spring to look for other components, configurations, and services
=====@ComponentScan=====
ComponentScan은 XML에 일일이 Bean 등록을 하지않아도, 각 Bean 클래스가 @Component를 통해 자동으로 Bean 등록이 되게 한다.\
@Component는 스프링이 어노테이션에 담긴 메타정보를 이용하기 시작했을 때 @Autowired와 함께 소개된 대표적인 어노테이션이다.
@Component 어노테이션을 클래스 위에 작성하면 Bean Scanner가 자동으로 빈 등록을 해준다. \
특정 패키지 아래에 위치한 빈들을 Component Scan하기 위한 방법은 다음과 같다.
Base Package를 지정한다. <context:component-scan base-package="com.nhnent.spring" />
자바 파일의 설정 클래스 @Configuration 에서 @ConponentScan 어노테이션을 설정한다.
Context Scan을 처리하는 부분은 spring-context-버전.jar에 위치하고 있으며 본문에 나오는 테스트코드와 소스는 스프링 프로젝트에서 확인할 수 수 있다.(스프링 프로젝트 소스 에서 구할 수 있음)
< 동작 과정에 대한 설명을 3가지 방향으로 진행할 것이다>
Component scan를 수행하는 과정.
컨테이너에서 getBean(beanName.class)을 호출하여 빈이 호출되는 과정.
Spring MVC에서 Component Scan
스프링 컨테이너가 실행되면서 수행하는 여러가지 초기화 과정 중에서, Component Scan 부분만 딱 잘라서 설명하면 앞뒤 과정이 없어 생소할 수 있기 때문에, 기본적인 Bean 등록, Bean 검색과 같이 연관성 있는 부분들도 같이 설명할 것이다
===실질적인 Component Scan이 진행되기 까지의 과정 요약===
@Configuration 어노테이션 클래스 파싱 (보통 @Configuration 설정 클래스에 @ComponentScan이 설정)
@ComponentScan 어노테이션 클래스 파싱
ComponentScanAnnotationParser 클래스
실질적으로Component scan 패키지 디렉토리에서 리소스를 찾는 ClassPathBeanDefinitionScanner
===적용 범위===
<context:component-scan> 태그를 설정파일에 추가하면 해당 어노테이션이 적용된 클래스를 Bean으로 등록하게 된다. \
디폴트 범위는 singleton이며 @Scope를 사용하여 지정할 수 있다.\
사용하려면 XML 설정파일에 <context:component-scan>을 정의하고 적용할 기본 패키지를 base-package 속성으로 등록한다.\
<context:component-scan /> 요소에는 scoped-proxy 속성이 존재 한다.\
scoped-proxy는 <aop:scoped-poxy/>처럼 WebApplicationContext 에서만 유효하며 \
"session", "globalSession", "request" 이외의 scope는 무시 되며 아래의 3가지 값을 설정 할 수 있다.
===== meta annotation에 대해서 부가적인 설명 =====
==== @Target ====
* ElementType.TYPE : 클래스, 인터페이스, enum 선언부
* ElementType.CONSTRUCTOR : 생성자 선언부
* ElementType.LOCAL_VARIABLE : 지역 변수 선언부
* ElementType.METHOD : 메소드 선언부
* ElementType.PACKAGE : 패키지 선언부
* ElementType.PARAMETER : 파라미터 선언부
==== @Retention====
* RetentionPolicy.RUNTIME : VM에서 유지 (리플렉션을 이용하여 검색 가능)
* RetentionPolicy.SOURCE : 컴파일 시 class 파일에 추가되지 않는다.
* RetentionPolicy.CLASS : 클래스 안에 애노테이션이 추가되지만 VM에서는 사용되지 않는다.
==== @Documented====
* 해당 어노테이션을 Javadoc에 포함한다.
==== @Inherited====
* 서브 클래스가 부모 어노테이션을 상속받도록 한다.