😊 서론
특정 어노테이션을 붙여야만 돌아가는 기능들이 있다. (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에 해당 어노테이션의 존재 표기하도록 설정
- JavaDoc에 해당 어노테이션의 존재 표기하도록 설정
- @Inherited
- 자식 클래스 생성 시 부모 클래스의 어노테이션 상속
- 자식 클래스 생성 시 부모 클래스의 어노테이션 상속
- @SpringBootConfiguration
- @Configuration 어노테이션이 적용된 bean
- @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이 등록되어 있으면 등록을 생략한다.
참고
'Develop > Spring+JPA' 카테고리의 다른 글
WHERE절 IN과 NamedParameterJdbcTemplate (0) | 2022.06.08 |
---|---|
[Spring 5 프로그래밍 입문] chapter 5, 6 - 컴포넌트 스캔과 빈 라이프 사이클 (0) | 2022.06.04 |
[Spring] @Aspect는 컴포넌트 스캔 대상일까? (4) | 2022.05.25 |
[Spring 5 프로그래밍 입문] chapter 3, 4 - 의존 주입 (4) | 2022.05.21 |
[Spring 5 프로그래밍 입문] chapter 2 - 스프링 시작하기 (0) | 2022.05.21 |