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====

* 서브 클래스가 부모 어노테이션을 상속받도록 한다.

[참고]http://lng1982.tistory.com/89

results matching ""

    No results matching ""