du.study기록공간

Spring boot @SpringBootApplication 본문

스프링

Spring boot @SpringBootApplication

du.study 2020. 5. 7. 00:52
728x90

이번엔 간단하게 SpringBootApplication 에 대하여 정리해보려 합니다. 먼저 Spring boot 프로젝트를 실행하면 다음과 같은 @SpringBootApplication이 생성되며, 내부는 다음과 같습니다.

@SpringBootApplication
public class DemoApplication {

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

}

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

해당 @SpringBootApplication을 들여다보면 크게 3가지로 나눠볼 수 있습니다.

 

1. @SpringBootConfiguration : 내부적으로 Configuration을 가지고 있는 어노테이션

2. @ComponetScan  :  @SpringBootApplication이 선언된 패키지 포함 하위 패키지 빈 등록

3. @EnableAutoConfiguration : 해당 어노테이션을 통해 추가 빈들을 등록하는 과정 진행

 

 

먼저 해당 어노테이션을 설정하게 되면 해당 패키지를 기점으로 @Component 하위 어노테이션을 선언하고있는 어노테이션들을 먼저 수집하게 됩니다.

 

추가로 해당 어노테이션(@SpringBootApplication)은 디폴트 패키지를 선언한 곳에서 생성하여 사용하는 것을 권장합니다.

이유는 아래와 같습니다. 패키지 선언없이 스캔을 하게되면 매우 방대한 범위를 찾게되버립니다.

----------------------------------------

3.2.1. Using the “default” Package

When a class does not include a package declaration, it is considered to be in the “default package”. The use of the “default package” is generally discouraged and should be avoided. It can cause particular problems for Spring Boot applications that use the @ComponentScan, @ConfigurationPropertiesScan, @EntityScan, or @SpringBootApplication annotations, since every class from every jar is read.

 

출처 : https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#using-boot-structuring-your-code

----------------------------------------

그 다음 @EnableAutoConfiguration 내부를 살펴보면 AutoConfigurationImportSelector 를 포함하고 있는데, 해당 클래스 동작을 통해서 spring.factories 파일 내용중 org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ 하위 내용들을 읽어들여 적용하게 됩니다. 

단 해당 리스트를 읽어들일때 어노테이션에 붙은 조건에따라 읽어오지 않는 설정파일들이 있을 수 있습니다. 

 

 

이 과정을 통하여 boot를 사용하지 않았을 경우, 만약 web프로젝트 라면 기본적으로 was부터 설정해야했던 부분들을 자동으로 내장으로 등록해준다거나 ( EmbeddedWebServerFactoryCustomizerAutoConfiguration) 웹설정을 진행해주는 등(WebMvcAutoConfiguration)의 편의성을 제공해주고 있습니다.

 

자동으로 등록해주는 bean이 많아지긴 하는데, 실제로 사용과 밀접한 관련이 있는 빈들을 차례차례 기록해봐야겠습니다.

 

728x90
Comments