스프링 개인 프로젝트를 하며 수많은 어노테이션에 대해서 조금씩 알아가고 있습니다. 그런데 어노테이션 그 자체에 대한 고민을 안해본 것 같아 이에 대해 기록하며 머리에 제대로 집어넣고 부트캠프에서 강의들은 자바의 클래스, 객체 등 오늘 배웠던 내용을 기록해보려 합니다.
Annotation 이란 무엇일까? 사전적의미
는 주석이다. 물론 사람이 읽는 주석은 아니다.어노테이션은 자바 소스 코드에 추가하여 사용할 수 있는 메타데이터의 일종이다. @ 기호를 앞에 붙여서 사용하며 클래스 파일에 임베디드되어 컴파일러에 의해 생성된 후 자바 가상머신에 포함되어 작동한다. 한마디로 컴파일러를 위한 주석 표시인 것이다.
어노테이션의 종류는 정말 다양한데 몇가지 정리를 해보려 한다.
@SpringBootApplication
기본적으로 Spring 이니셜라이저를 사용해 만든다면 메인클래스에 설정되어있는 어노테이션이다.
가장 기본적인 어노테이션이다. @Configuration, @EnableAutoConfiguration, @ComponentScan 3가지를 하나의 애노테이션으로 합친 것이다.
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.beans.factory.support.BeanNameGenerator;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.context.TypeExcludeFilter;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.core.annotation.AliasFor;
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = {TypeExcludeFilter.class}),
@Filter(type = FilterType.CUSTOM, classes = {AutoConfigurationExcludeFilter.class})
}
)
public @interface SpringBootApplication {
@AliasFor(annotation = EnableAutoConfiguration.class)
Class<?>[] exclude() default {};
@AliasFor(annotation = EnableAutoConfiguration.class)
String[] excludeName() default {};
@AliasFor(annotation = ComponentScan.class, attribute = "basePackages")
String[] scanBasePackages() default {};
@AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses")
Class<?>[] scanBasePackageClasses() default {};
@AliasFor(annotation = ComponentScan.class, attribute = "nameGenerator")
Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class;
@AliasFor(annotation = Configuration.class)
boolean proxyBeanMethods() default true;
}
코드를 까보며 한번 알아보자.
@Target
@Target은 컴파일러가 어노테이션이 어디에서 사용할지를 결정하기 위해 사용한다.
ElememtType.PACKAGE : 패키지 선언
ElememtType.TYPE : 타입 선언
ElememtType.ANNOTATION_TYPE : 어노테이션 타입 선언
ElememtType.CONSTRUCTOR : 생성자 선언
ElememtType.FIELD : 멤버 변수 선언
ElememtType.LOCAL_VARIABLE : 지역 변수 선언
ElememtType.METHOD : 메서드 선언
ElememtType.PARAMETER : 전달인자 선언
ElememtType.TYPE_PARAMETER : 전달인자 타입 선언
ElememtType.TYPE_USE : 타입 선언
ElememtType만을 매개변수로 설정 가능하다.
@Retention
Retention은 어노테이션의 라이프 사이클을 결정한다. retention 어노테이션이 설정되어 있지 않다면 기본적으로(RetentionPolicy.CLASS)으로 설정이 된다. Retention 어노테이션은 직접 사용된 경우에만 적용된다.
@Documented
@Documented는 javadoc으로 작성한 문서에 포함되도록 하는 어노테이션 설정입니다.
@Inherited
@Inherited을 사용한 클래스를 상속받게되면 자식 클래스에도 어노테이션이 적용된다.
@SpringBootConfiguration
@SpringBootConfiguration은 기본적으로 스프링의 @Configuration을 상속받아 사용한다. 이 애노테이션이 붙은 클래스는 스프링의 애플리케이션 컨텍스트에 빈 정의를 등록하는 역할을 합니다.
@EnableAutoConfiguration
@EnableAutoConfiguration을 사용하면 애플리케이션에서 @ConfigurationProperties 애노테이션이 적용된 클래스를 지원한다.
@ComponentScan
@ComponentScan을 사용하면 @Component를 명시한 클래스들을 Scan하여 Bean을 생성한다. 위 코드와 같이 지정한 범위를 설정할 수 있다.
간단히 정리하자면 @SpringBootApplication은 설정 클래스 등록, 자동 bean 구성 활성화하여 컴포넌트 자동 스캔을 한꺼번에 해주는 Spring Boot 앱의 진입점 어노테이션이라고 정리할 수 있을 것 같다.
체크~