@SpringBootApplication 살펴보기

초보개발·2022년 6월 26일
0

XXApplication.java

@SpringBootApplication
public class XXApplication {

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

}

애플리케이션 메인 클래스를 보면 @SpringBootApplication이 있다. 이 어노테이션 덕분에 Spring에서 설정해야 했던 일들이 사라졌다.

@SpringBootApplication

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

여기서 필수 어노테이션을 추려보면,

  • @SpringBootConfiguration: @Configuration의 역할을 하지만 구성을 자동으로 찾아주는 기능이 있어 프로젝트 내에 한 번만 사용할 수 있다.
  • @ComponentScan: 해당 패키지에 정의된 빈을 컨테이너에 등록한다. 사용자 설정 단계
  • @EnableAutoConfiguration: 컴포넌트 스캔으로 Bean을 등록하고 나서 Configuration의 Bean을 등록한다. 자동 설정 단계
    • 컴포넌트 스캔을 먼저 하는 이유? 사용자가 등록한 빈이 있으면 먼저 사용하고 없다면 드폴트로 스프링 부트에서 지정해둔 설정을 사용하기 위함

@EnableAutoConfiguration

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
  • @Import(AutoConfigurationImportSelector.class)
public class AutoConfigurationImportSelector implements DeferredImportSelector, BeanClassLoaderAware,
		ResourceLoaderAware, BeanFactoryAware, EnvironmentAware, Ordered { }

AutoConfigurationImportSelector는 위의 인터페이스들을 구현한다. 그 중 DeferredImportSelector는 설정 클래스가 import되고 나서 호출되어 필요한 부분을 활성화시킨다.

  • getCandidateConfigurations()
    내부 메서드인 getCandidateConfigurations()는 클래스 이름대로 설정의 후보를 가져온다.
	protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
		List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),
				getBeanClassLoader());
		Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you "
				+ "are using a custom packaging, make sure that file is correct.");
		return configurations;
	}

여기서 사용되는 SpringFactoriesLoade는 클래스 경로에 있는 모든 JAR 파일의 META-INF/spring.factories에서 설정 파일 목록을 가져오는 역할을 한다.
미리 정의된 설정들이 @Conditional~ 조건에 의해 활성화되거나 비활성화되면서 사용자가 추가한 여러 spring-boot-starter-*가 활성화되고 설정된다.

커스텀 @Conditional 애노테이션과 설정 파일을 만들고 모듈의 META-INF/spring.factories에 설정 파일을 지정하면 스프링 부트가 지원하는 자동 설정 기능을 만들 수 있다.

출처


https://docs.spring.io/spring-boot/docs/2.0.x/reference/html/using-boot-using-springbootapplication-annotation.html

0개의 댓글