Spring

[Spring Boot] @SpringBootApplication

curiousKidd 2022. 6. 30. 17:11
반응형

스프링부트 메인 클래스에는 @SpringBootApplication 라는 어노테이션이 붙어있다.

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

 

메인 클래스에 붙어 있는 @SpringBootApplication은 크게 3가지가 합쳐진 것이라고 생각할 수 있다.

  1. @SpringBootConfiguration
  2. @ComponentScan
  3. @EnableAutoConfiguration

 

스프링 부트 어플리케이션은 Bean을 2번 등록한다. 처음에 ComponentScan으로 등록하고, 그 후에 EnableAutoConfiguration으로 추가적인 Bean들을 읽어서 등록한다.

 

@ComponentScan

@ComponentScan은 해당 패키지에서 @Component 어노테이션을 가진 Bean들을 스캔해서 등록하는 것이다.(@Configuration, @Repository, @Service, @Controller, @RestController 포함)

 

@EnableAutoConfiguration

AutoConfiguration은 결국 Configuration이다. 즉, Bean을 등록하는 자바 설정 파일이다.

spring.factories 내부에 여러 Configuration 들이 있고, 조건에 따라 Bean을 등록한다.

(@ComponentScan에서 등록되지 않은 정보)

 

 

위와 같이 org.springframework.boot.autoconfigure.EnableAutoConfiguration라는 Key값이 존재하며 하위에 많은 Class를 가지고 있다.

 

또한 해당 Class들은 상단에 @Configuration이라는 Annotation을 가지고 있다.(@Configuration은 Bean을 등록하는 Java 설정파일)

 

이러한 키값을 통하여 명시된 많은 Class들이 AutoConfiguration의 대상이 된다.

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
...
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\
...

 

하지만 실제로 모든 Class들이 다 Bean으로 등록되진 않는다.

 

실제로 해당 클래스들을 확인해 보면 @ConditionalOnXxx… 와 같은 형태로 Condition에 적합한 경우 생성하고 생성하지 않게 설정되어 있다.

 

또한 각 Bean의 생성 우선순위 등 여러 다른 설정들도 포함한다.

반응형