Spring Boot - 자동 설정 이해

Spring Boot - 자동 설정 이해

@SpringBootApplication 은 크게 3가지 어노테이션으로 이루어져 있다. @ComponentScan에서 1차적으로 @Bean을 읽어들인 후 @EnableAutoConfiguration에서 2차적으로 @Bean을 읽어들인다.

  1. @SpringBootConfiguration
    • @SpringBootConfiguration은 기존의 Configuration과 비슷하다.
  2. @ComponentScan
    • @ComponentScan 은 value 혹은 basePackages 속성을 이용해 component scan 을 시작하는 위치를 설정한다.
    • 기본 값은 @ComponentScan 가 작성된 하위 패키지의 모든 @Component 와 @Bean 을 찾아 Spring Bean 으로 등록한다.
  3. @EnableAutoConfiguration
    • Spring Boot가 제공하는 클래스를 Spring 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 이 없어도 작동은 하지만 문제가 생긴다.

@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.

스프링부트는 코드를 웹 어플리케이션 형태로 제작하는데, 웹 어플리케이션으로 만드는 과정에서 EnableAutoConfiguration에서 읽어들어들이는 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으로 만들어 주는 설정을 끌 수 있다. 작동은 가능하나 웹 어플리케이션으로 작동하지는 않는다.

@EnableAutoConfiguration

EnableAutoConfiguration은 Spring boot의 META file을 읽어 들인다.

EnableAutoConfiguration 대상

@ConditionalOnXxxYyyZzz

@ConditionalOnWebApplication(type = Type.SERVLET)

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

@ConditionalOnMissingBean(HiddenHttpMethodFilter.class)

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

Share