@SpringBootApplication

개발하는 구황작물·2024년 2월 29일
0

Spring

목록 보기
6/6

SpringBoot 진영 개발자라면 이 코드를 자주 봤을 것이다.

@SpringBootApplication
public class Api1Application {

    public static void main(String[] args) {
        SpringApplication.run(Api1Application.class, args);


    }
}

이 코드에 @SpringBootApplication가 왜 있는 것이고 어떤 기능을 하는지 알아보겠다.

@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는 스캔 대상에서 제외하고 싶을 때 사용된다.

profile
어쩌다보니 개발하게 된 구황작물

0개의 댓글