스프링부트 메인 클래스에는 @SpringBootApplication 라는 어노테이션이 붙어있다.
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
메인 클래스에 붙어 있는 @SpringBootApplication은 크게 3가지가 합쳐진 것이라고 생각할 수 있다.
- @SpringBootConfiguration
- @ComponentScan
- @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의 생성 우선순위 등 여러 다른 설정들도 포함한다.
'Spring' 카테고리의 다른 글
Spring database config bean 설정 예제 by JPA (0) | 2024.04.04 |
---|---|
Spring AOP, AOP 용어 정리 (0) | 2022.07.05 |
@WebServlet, @Controller 의 차이 (0) | 2022.06.01 |
스프링 컨테이너란? (0) | 2022.04.26 |
Spring을 사용하는 이유 ( 객체 지향의 원칙 ) (1) | 2022.04.12 |