SpringBoot 진영 개발자라면 이 코드를 자주 봤을 것이다.
@SpringBootApplication
public class Api1Application {
public static void main(String[] args) {
SpringApplication.run(Api1Application.class, args);
}
}
이 코드에 @SpringBootApplication가 왜 있는 것이고 어떤 기능을 하는지 알아보겠다.
@SpringBootApplication 코드이다.
package org.springframework.boot.autoconfigure;
@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;
}
Annotation 종류 및 의미
@Target
Java 컴파일러가 어노테이션이 어디에 적용될지 결정하기 위해 사용된다.
위의 @Target 타입에는 ElementType.Type로 설정되어 있어 해당 어노테이션이 클래스나 인터페이스 같은 타입 요소에 어노테이션이 적용될 수 있음을 뜻한다.
종류는 아래와 같다.
ElementType.PACKAGE : 패키지 선언
ElementType.TYPE : 타입 선언
ElementType.ANNOTATION_TYPE : 어노테이션 타입 선언
ElementType.CONSTRUCTOR : 생성자 선언
ElementType.FIELD : 멤버 변수 선언
ElementType.LOCAL_VARIABLE : 지역 변수 선언
ElementType.METHOD : 메서드 선언
ElementType.PARAMETER : 전달인자 선언
ElementType.TYPE_PARAMETER : 전달인자 타입 선언
ElementType.TYPE_USE : 타입 사용 시점 선언
@Retention
@Retention은 해당 어노테이션이 실제로 적용되고 유지되는 범위를 나타낸다.
종류는 아래와 같다.
RetentionPolicy.RUNTIME : 컴파일 이후에도 JVM읠 통해 계속 참조가능.
RetentionPolicy.CLASS : 컴파일러가 클래스를 참조할 때까지만 유효
RetentionPolicy.SOURCE : 컴파일 전까지만 유효. 컴파일 이후에는 사라지게 된다.
@Documented
클래스 문서화시 해당 어노테이션이 적용되었음을 명시하도록 한다.
@Inherited
@Inherited는 어노테이션의 상속을 허용한다.
@Inherited
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface InheritedAnnotation {
}
@InheritedAnnotation
public class ParentClass {
}
public class ChildClass extends ParentClass {
//자동적으로 ParentClass가 가지고 있는 @InheritedAnnotation를 ChildClass도 가지게 된다.
}
@SpringBootConfiguration
@SpringBootConfiguration는 어플리케이션의 구성을 자동으로 찾아주는 어노테이션으로 한 서비스 내에 하나만 사용 가능하다.
@SpringBootConfiguration는 @Configuration과 @Indexed를 포함한다.
@Configuration는 스프링 컨테이너에 어노테이션이나 빈을 등록해준다.
@Indexed는 어노테이션이 달린 요소가 index에 대한 스테레오타입임을 뜻한다.
@EnableAutoConfiguration
@EnableAutoConfiguration는 base package로 정의된 모든 빈을 자동구성해준다.
@ComponentScan
@ComponentScan은 @Component어노테이션을 명시한 클래스들을 스캔하여 해당 클래스를 빈으로 만들어 스프링 컨테이너에 등록시켜준다.
excludeFilters는 스캔 대상에서 제외하고 싶을 때 사용된다.