본문 바로가기
Spring/Spring Boot

[Spring Boot] 자동 구성 동작

by 제우제우 2024. 9. 3.

엔트리 포인트 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

AutoConfigurationImportSelectorImportSelector의 구현체

따라서 설정 정보를 동적으로 선택할 수 있다.

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