Spring Boot - @SpringBootApplication 알아보기

@SpringBootApplication

@SpringBootApplication 은 Spring Boot 애플리케이션의 진입점으로 사용되는 어노테이션으로, Spring Boot 설정 및 실행에 필요한 여러 기능을 한 곳에서 제공합니다.

@SpringBootApplication 은 크게 3가지 어노테이션으로 이루어져 있습니다.

@ComponentScan에서 1차적으로 @Bean을 읽어들인 후 @EnableAutoConfiguration에서 2차적으로 @Bean을 읽어들인다.

  1. @SpringBootConfiguration
    • @SpringBootConfiguration은 기존의 Configuration과 비슷하다.
  2. @ComponentScan
    • 기본 값은 @SpringBootApplication 가 작성된 패키지와 하위 패키지의 모든 @Component 와 @Bean 을 찾아 Spring Bean 으로 등록한다.
  3. @EnableAutoConfiguration
    • Spring Boot의 핵심 기능인 자동 설정을 활성화합니다.
    • 라이브러리와 설정을 기반으로 필요한 Bean 들을 설정합니다.

즉 springboot는 Bean을 두번 등록하는 작업을 거친다.

SpringBootApplication

@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.classAutoConfigurationExcludeFilter.class들을 제외하여 scan한다.

@EnableAutoConfiguration

EnableAutoConfiguration 은 spring-boot-autoconfigure 패키지내 META-INF 폴더에 정의된 spring.factories 파일을 읽어 자동으로 설정을 잡아줍니다.

spring.factories 파일내 org.springframework.boot.autoconfigure.EnableAutoConfiguration 을 키로 자동으로 설정을 잡아줄 항목들이 정의돼 있습니다.

애플리케이션의 클래스패스에 있는 라이브러리와 설정을 기반으로, 필요한 빈을 자동으로 구성하고 등록합니다.

EnableAutoConfiguration 대상

@EnableAutoConfiguration 제거

스프링부트에서 @EnableAutoConfiguration 이 없어도 작동은 하지만 문제가 생긴다.

@SpringBootConfiguration
@ComponentScan
// @EnableAutoConfiguration
public class Application {

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

Caused by: org.springframework.context.ApplicationContextException: Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean.

자동 설정을 비활성화 함으로써 어플리케이션을 웹으로 띄우기 위한 설정이 안돼 있기 때문에 ServletWebServerFactory bean 이 없다는 에러가 발생합니다.

SpringApplication.run()을 바로 사용하게 되면 웹 어플리케이션 형태로 작동을 한다. EnableAutoConfiguration없이는 웹 어플리케이션으로 만드는 것이 불가능 하므로 바로 사용할 수 없다.

@SpringBootConfiguration
@ComponentScan
//@EnableAutoConfiguration
public class Application {

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

// SpringApplication 인스턴스를 생성하면 커스터마이징 해서 사용이 가능하다.
SpringApplication application = new SpringApplication(Application.class);
// webApplication만드는 설정을 꺼준다.
application.setWebApplicationType(WebApplicationType.NONE);
application.run(args);

}
}

SpringApplication 인스턴스를 생성한 후에 setWebApplicationType()메소드를 이용하여 WebApplicationType.NONE인자 값을 넘겨주면 webApplication으로 만들어 주는 설정을 끌 수 있다. 작동은 가능하나 웹 어플리케이션으로 작동하지는 않는다.

@ConditionalOnXxxYyyZzz

@ConditionalOnWebApplication(type = Type.SERVLET)

웹 어플리케이션 타입에 따라 설정을 다르게 한다.

@ConditionalOnMissingBean(HiddenHttpMethodFilter.class)

해당 Bean이 없으면 다른 것을 등록 한다.

Share