본문 바로가기
Spring/Spring Boot

@SpringBootApplication에는 어떤 Annotation으로 이루어져 있을까요?

by 졸린개발자 2022. 5. 17.

안녕하세요. 졸린개발자입니다.

 

오늘은 @SpringBootApplication에서

어떤 Annotation으로 이루어져 있을지 살펴봅시다.

 

우선 SpringBootApplication annotation을 먼저 살펴봅시다.

 

<그림1 SpringBootApplication>

 

@Target(ElementType.TYPE)

이 어노테이션은 java.lang에서 제공하는 어노테이션입니다.

 

Target은 어느곳에 이 어노테이션을 쓸 수 있는지에 대해 설정하는것인데,

지금 ElementType.TYPE이라고 되어있군요.

 

그럼 한번 TYPE의 소스의 주석을 볼까요?

 

<그림2 ElementType.TYPE>

class, interface, enum, 그리고 record에 이 어노테이션을 붙을 수 있게 해줍니다.

 

 

@Retention(RetentionPolicy.RUNTIME)

이 어노테이션은 java.lang에서 제공하는 어노테이션입니다

 

Retention의 뜻은 유지, 유지력입니다.

뜻 그대로, 이 어노테이션이 어디까지 유지될지 결정합니다.

 

그럼 RUNTIME의 주석을 볼까요?

<그림3 RetentionPolicy.RUNTIME>

runtime까지 유지하는군요. 

이 Retention으로 인해 Runtime에 해당 어노테이션의 정보를 알 수 있습니다.

 

 

@Doucment

javadoc에서 해당 어노테이션을 같이 문서화합니다.

 

 

@Inherited

해당 어노테이션이, 클래스를 상속하는 자식 클래스에게도 적용됩니다.

 

예를 들어봅시다.

현재 @SpringBootApplication이 적용된 MainClass가 있다고 가정합시다.

그럼 이 MainClass를 상속한 SubClass라는 클래스도 @SpringBootApplication이 적용됩니다.

 

만약 @Inhertied가 없다면, MainClass를 상속한 SubClass는 @SpringBootApplication이 적용되지 않습니다.

 

 

@SpringBootConfiguration

 

<그림4 SpringBootConfiguration>

소스코드상으로는 Configuration밖에 없군요.

주석을 봐야겠습니다.

 

<그림5 SpringBootConfiguration주석>

(사진은 클릭하면 크게보입니다.)

 

spring boot application @Configuration을 제공하는것을 가리켜주기 위해 있다고 나오네요.

그럼 @Configuration쓰면 되는거 아닌가? 생각이 드네요.

@Configuration쓰기에는 나중에 확장가능성이 있으니까 이걸 둔건가? 라는 생각도 드네요

 

 

@EnableAutoConfiguration

<그림6 EnableAutoConfiguration>

소스상으로는 크게 볼 것은 없군요.

 

좀 더 찾아보니 Spring boot의 자동설정과 관련되어있는것 같습니다.

이 어노테이션이 붙으면, Spring boot의 spring.factories에 적혀있는 자동설정들을 불러와주는것 같습니다.

자세한건 나중에 더 공부해봐야겠네요.

 

 

@ComponentScan

<그림7 ComponentScan>

Component를 base package로부터 scan해서 

@Component가 붙어있는 클래스들을 bean으로 등록해주는 scan을 가능하게 해주는 어노테이션입니다.

 

근데 excludeFilters에 FilterType은 CUSTOM이고 class는 TypeExcludeFilter.class가 있군요.

저건 뭘까요?

<그림8 TypeExcludeFilter>

주석을 읽어보니, TypeFilter를 구현한 Custom filter들에 대해, filter를 동작시킬 수 있도록 하네요.

즉, 이게 있어야 TypeFilter를 구현한 클래스가 제대로 작동할 수 잇겠네요.

 

 

exclude filter에 AutoConfigurationExcludeFilter가 또 있군요.

저건 뭘까요?

<그림9 AutoConfigurationExcludeFilter>

이미 등록된 bean이 auto configuration에서 또 다시 등록되지 않도록 하는것 같군요

솔직히 정보를 찾기가 쉽지않고, 저 주석 하나로 뭘 알수가 없네요.

 

 

결론

@SpringBootApplication은 총 3개의 어노테이션으로 구성되어 있습니다.

  1. SpringBootConfiguration - configuration
  2. EnableAutoConfiguration - 자동설정
  3. ComponentScan