@SpringBootApplication
@SpringBootApplication은 Spring Boot FrameWork에서 주요한 어노테이션 중 하나로, Spring Boot Application을 개발하는 데 사용 됩니다. 해당 어노테이션을 사용하면 Spring Boot는 Application 설정을 자동으로 구성하고, 필요한 Spring Bean 들을 자동으로 검색하여, classpath에 있는 라이브러리들을 기반으로 자동 구성을 활성화합니다. @SpringBootApplication에서는 내부적으로 다음과 같은 일을 수행합니다
@SpringBootConfiguration
Spring Boot에서 사용되는 특수한 유형의 @Configuration으로, 설정 클래스를 지정할 수 있습니다. 클래스 내부에 @Bean 을 사용하여 Bean 정의 메서드를 작성할 수 있습니다.
@ComponentScan
스프링이 현재 패키지와 하위 패키지를 스캔하여 컨트롤러, 서비스, 레포지토리 등과 같은 스프링 구성요소들을 자동으로 검색하고 등록할 수 있도록 합니다. 또한 개발자가 클래스에 붙인 어노테이션을 스캔하여 Bean으로 등록해 줍니다.
참고로 모든 어노테이션을 스캔하여 Bean으로 등록해주지는 않습니다.
그림과 같이 @Component를 상속받은 클래스에서만 빈으로 등록해 줍니다. 대표적으로 @Controller, @Service, @Repository, @RestController 등이 @Component에 상속을 받으며, 스프링 애플리케이션이 작동될 때, 해당 어노테이션이 붙여진 클래스들을 빈으로 등록해 줍니다.
@EnableAutoConfiguration
Configuration과 동일하게, Bean을 등록하는 자바 설정 파일입니다. spring.factories 내부에 여러 Configuration들이 존재하고, 조건에 따라 Bean으로 등록합니다. spring-boot-starter 안에는 자동 설정을 위해 spring-boot-autoconfigure 라이브러리가 포함되어 잇습니다. @EnableAutoConfiguration도 해당 라이브러리에 포함되어 있으며, META-INF/spring.factories 파일이 존재합니다.
spring.factories를 열어보면 Auto Configure 밑에 있는 클래스들이 모두 자동 설정의 대상이 됩니다. 일반 적으로 스프링부트 환경에서 라이브러리를 추가한다면, 해당 라이브러리의 자동 설정 파일은 spring.factories에 정의가 되고, 정의된 설정은 스프링 부트가 기동 시 실행하여 빈등록이나 추가 초기화 작업을 수행하게 됩니다.
@SpringBootApplication 은 Spring Boot Application의 초기화와 설정을 크게 단순화시키고, 빠르게 개발할 수 있도록 도와줍니다.