@SpringBootApplication
@SpringBootApplication
은 Spring Boot 애플리케이션의 진입점으로 사용되는 어노테이션으로, Spring Boot 설정 및 실행에 필요한 여러 기능을 한 곳에서 제공합니다.
@SpringBootApplication 은 크게 3가지 어노테이션으로 이루어져 있습니다.
@ComponentScan
에서 1차적으로 @Bean을 읽어들인 후 @EnableAutoConfiguration
에서 2차적으로 @Bean을 읽어들인다.
@SpringBootConfiguration
- @SpringBootConfiguration은 기존의
Configuration
과 비슷하다.
- @SpringBootConfiguration은 기존의
@ComponentScan
- 기본 값은 @SpringBootApplication 가 작성된 패키지와 하위 패키지의 모든 @Component 와 @Bean 을 찾아 Spring Bean 으로 등록한다.
@EnableAutoConfiguration
- Spring Boot의 핵심 기능인 자동 설정을 활성화합니다.
- 라이브러리와 설정을 기반으로 필요한 Bean 들을 설정합니다.
즉 springboot는 Bean을 두번 등록하는 작업을 거친다.
@ComponentScan
@ComponentScan
은 Application.class에 있다. 위 그림에서는 a와 b 패키지의 경우는 ComponentScan의 대상이 되나 maple 패키지의 경우 ComponentScan의 대상이 되지 않는다.
@ComponentScan에서 Scan 대상
@Component @Configuration @Repository @Service @Controller @RestController
- 위 어노테이션을 가진 class들을 scan하여
Bean
으로 등록을 한다. @ComponentScan
을 가진 class부터 시작하여 하위 package들을 scan해 위 어노테이션이 달려 있는 것들을Bean
으로 등록한다.- scan을 할 때는
TypeExcludeFilter.class
와AutoConfigurationExcludeFilter.class
들을 제외하여 scan한다.
@EnableAutoConfiguration
EnableAutoConfiguration 은 spring-boot-autoconfigure
패키지내 META-INF
폴더에 정의된 spring.factories 파일을 읽어 자동으로 설정을 잡아줍니다.
spring.factories 파일내 org.springframework.boot.autoconfigure.EnableAutoConfiguration
을 키로 자동으로 설정을 잡아줄 항목들이 정의돼 있습니다.
애플리케이션의 클래스패스에 있는 라이브러리와 설정을 기반으로, 필요한 빈을 자동으로 구성하고 등록합니다.
@EnableAutoConfiguration 제거
스프링부트에서 @EnableAutoConfiguration
이 없어도 작동은 하지만 문제가 생긴다.
|
Caused by: org.springframework.context.ApplicationContextException: Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean.
자동 설정을 비활성화 함으로써 어플리케이션을 웹으로 띄우기 위한 설정이 안돼 있기 때문에 ServletWebServerFactory bean
이 없다는 에러가 발생합니다.
SpringApplication.run()
을 바로 사용하게 되면 웹 어플리케이션 형태로 작동을 한다. EnableAutoConfiguration
없이는 웹 어플리케이션으로 만드는 것이 불가능 하므로 바로 사용할 수 없다.
|
SpringApplication
인스턴스를 생성한 후에 setWebApplicationType()
메소드를 이용하여 WebApplicationType.NONE
인자 값을 넘겨주면 webApplication으로 만들어 주는 설정을 끌 수 있다. 작동은 가능하나 웹 어플리케이션으로 작동하지는 않는다.
@ConditionalOnXxxYyyZzz
@ConditionalOnWebApplication(type = Type.SERVLET)
웹 어플리케이션 타입에 따라 설정을 다르게 한다.
@ConditionalOnMissingBean(HiddenHttpMethodFilter.class)
해당 Bean이 없으면 다른 것을 등록 한다.