엔트리 포인트 main()
@SpringBootApplication
public class SecurityApplication {
public static void main(String[] args) {
SpringApplication.run(SecurityApplication.class, args);
}
}
스프링 부트 애플리케이션의 엔트리 포인트이다.
스프링 부트가 실행이 되면 main 메서드가 실행이 되면서
SpringApplication.run(SecurityApplication.class, args); 메서드가 실행이 된다.
@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의 특성을 가지며, Spring 애플리케이션의 설정을 정의하는 데 사용
- @Configuration은 이 클래스가 스프링 컨텍스트에 빈 정의를 포함하고 있음을 나타낸다.
@ComponentScan
- 애플리케이션의 컴포넌트 스캔을 제어하는 애노테이션
- 기본적으로 애플리케이션의 현재 패키지 및 하위 패키지에서 컴포넌트(@Component, @Service, @Repository, @Controller 등)를 스캔
@EnableAutoConfiguration
- Spring Boot의 자동 구성을 활성화하는 핵심 애노테이션
- 클래스패스에 존재하는 라이브러리와 애플리케이션의 설정에 따라 필요한 빈들을 자동으로 설정하고 등록
@EnableAutoConfiguration
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
// 생략 ...
}
@AutoConfigurationPackage
자동 구성으로 넣을 패키지 관리
@Import에 설정 정보 추가하는 방법 2가지
1. 정적인 방법: @Import (클래스) 이것은 정적이다. 코드에 대상이 딱 박혀 있다. 설정으로 사용할 대상을 동적으로 변경할 수 없다.
2. 동적인 방법: @Import (ImportSelector) 코드로 프로그래밍해서 설정으로 사용할 대상을 동적으로 선택할 수 있다.
ImportSelector 인터페이스
스프링은 설정 정보 대상을 동적으로 선택할 수 있는 ImportSelector 인터페이스를 제공
package org.springframework.context.annotation;
public interface ImportSelector {
String[] selectImports(AnnotationMetadata importingClassMetadata);
//...
}
AutoConfigurationImportSelector
AutoConfigurationImportSelector는 ImportSelector의 구현체
따라서 설정 정보를 동적으로 선택할 수 있다.
public class AutoConfigurationImportSelector implements DeferredImportSelector, BeanClassLoaderAware,
ResourceLoaderAware, BeanFactoryAware, EnvironmentAware, Ordered {
// 생략 ..
}
모든 라이브러리에 있는 다음 경로의 파일을 확인한다
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
그리고 파일의 내용을 읽어서 설정 정보로 선택
스프링 부트 애플리케이션 시작 이후
getCandidateConfigurations() 메서드
고려해야 할 자동 구성 클래스 이름을 반환(자동 구성 후보들)
기본적으로 이 메서드는 ImportCandidates 사용하여 후보를 로드
@AutoConfiguration 붙은 AutoConfiguration.class를 로드한다.
AutoConfigurationEntry() 메서드
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 에는 스프링 부트가
자동 구성으로 등록 가능한 모든 클래스가 있는 반면
실제 등록된 클래스들은 33개이다. 조건에 따라 등록이 안 되어서 그렇다.
스프링 부트 자동 구성이 동작하는 방식
1. @SpringBootApplication
2. @EnableAutoConfiguration
3. @Import(AutoConfigurationImportSelector.class)
4. /META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 파일을 열어서 자동 구성 클래스 나열
5. 조건에 따라 클래스를 등록 (@ConditionalOnClass, @ConditionalOnMissingBean, @ConditionalOnProperty)
'Spring > Spring Boot' 카테고리의 다른 글
스프링 부트 프로젝트 빌드 (0) | 2024.08.24 |
---|