본문 바로가기
Develop/Spring+JPA

[Spring Boot] 내가 설정하지 않아도 동작하는 어노테이션

by 연로그 2022. 5. 28.
반응형

😊 서론

 특정 어노테이션을 붙여야만 돌아가는 기능들이 있다. (ex: AOP를 사용하기 위해 @EnableAspectJAutoProxy 사용한다 등) 그런데 어노테이션을 달지도 않았는데 정상적으로 동작했다. Spring Boot에서 지원해주는 기능이라 예상하며 @SpringBootApplication 어노테이션을 열어보려고 한다. 결론을 바로 보고 싶은 사람들은 @SpringBootApplication은 생략하고 @EnableAutoConfiguration을 보자.

 

🚀 @SpringBootApplication

main 메서드가 있는 클래스에 적용된 어노테이션이다. 간단히 살펴보자.

@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 {
	// ...
}
  • @Target
    • 어노테이션이 부착될 수 있는 타입
    • ElementType.TYPE: 클래스, 인터페이스, Enum

  • @Retention
    • 어노테이션의 라이프 사이클 설정

  • @Documented
    • JavaDoc에 해당 어노테이션의 존재 표기하도록 설정

  • @Inherited
    • 자식 클래스 생성 시 부모 클래스의 어노테이션 상속

  • @SpringBootConfiguration
    • @Configuration 어노테이션이 적용된 bean

  • @EnableAutoConfiguration
    • 스프링 부트의 Application Context 설정을 자동으로 수행
    • jar dependencies를 기반으로 Spring을 구성하는 방법을 추측할 수 있게 함

  • @ComponentScan
    • @Component 어노테이션이 부여된 클래스들을 자동으로 스캔해 Bean으로 등록

 

🔻 @SpringBootConfiguration vs @Configuration

더보기

@SpringBootConfiguration은 configuration을 자동으로 적재하는 것을 허용한다. (커스텀 configuration을 알아서 찾아줘서 편하게 사용 가능하다는 뜻으로 이해했다) 따라서 테스트 코드를 작성할 때 등 여러가지 상황에서 유용하게 쓰일 수 있다.

 

🔻 @ComponentScan vs @EnableAutoConfiguration

더보기

@ComponentScan

  • @Coponent 어노테이션을 스캔
  • @Configuration를 설정한 클래스와 함께 활용해 Spring의 구성요소를 스캔할 위치 지정 가능

 

@EnableAutoConfiguration

  • auto configuration을 활성화
  • classpath에 포함된 jar 파일들과 직접 정의한 bean들을 기반으로 bean을 생성 및 등록
    ex: spring-boot-starter-web을 classpath에 주입 받는다면 Tomcat과 Spring MVC를 자동으로 구성해준다. (다만 직접 정의한 configuration보다 우선 순위가 낮다.)

 

💥 @EnableAutoConfiguration

내가 의심하는건 요 어노테이션이다. stack overflow에서는 클래스 경로 설정, 빈 설정 등 다양한 설정을 해준다고 한다. 해당 어노테이션의 특징에 대해 간단히 살펴보자.

 

  • 스프링 부트에서 필요한 자동 설정에 관한 설정 담당
  • @ComponentScan 먼저 진행한 후 자동 설정

 

자 이제 본격적으로 내가 설정하지 않았지만 동작하는 것들을 찾아보자.

나는 @EnableWebMvc 어노테이션을 찾으려고 한다.

 

1. auto configure 목록 확인하기

프로젝트 내에 존재하는 외부 라이브러리에서  spring-boot-autoconfiguration/META-INF/spring.factories  파일을 살펴보자.

 

상당히 많은 설정들이 존재한다.

@EnbaleWebMvc는 WebMvc와 관련된 설정이라고 추측할 수 있다.

WebMvcAutoConfiguration이 목록에 있는 것을 확인할 수 있었다.

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
...
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\

 

2. Configuration 클래스 확인하기

WebMvcAutoConfiguration 파일을 열어보니 또 이런 여러가지 어노테이션들이 존재한다.

@Configuration(proxyBeanMethods = false)
@ConditionalOnWebApplication(type = Type.SERVLET)
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class,
		ValidationAutoConfiguration.class })
public class WebMvcAutoConfiguration {
    // ...
}

 

@ConditionalOnMissingBean을 통해 등록된 WebMvcConfigurationSupport 클래스를 살펴보았다.

구체적인 내부 동작은 모르겠지만 주석에서 @EnableWebMvc에 대한 이야기를 확인할 수 있었다.

This is the main class providing the configuration behind the MVC Java config. It is typically imported by adding @EnableWebMvc to an application @Configuration class. An alternative more advanced option is to extend directly from this class and override methods as necessary, remembering to add @Configuration to the subclass and @Bean to overridden @Bean methods. For more details see the javadoc of @EnableWebMvc.

 

🔻 @ConditionalOnMissingBean

더보기

: 등록하려는 bean이 없으면 자동으로 등록한 bean을 사용한다.

이미 동일한 bean이 등록되어 있으면 등록을 생략한다.

 


참고

반응형