Spring Boot 자동 환경 설정 이해하기
Spring Boot 자동 설정은 Web, H2, JDBC 등 100여 개의 자동 설정을 제공한다.
새로 추가되는 라이브러리(JAR)는 Spring Boot 자동 설정 의존성에 따라서 설정이 자동 적용된다.
자동 설정은 @EnableAutoConfiguration 혹은 @SpringBootApplication 중 하나를 사용하면 된다.
@EnableAutoConfiguration 사용 시 @Configuration와 같이 사용해야 한다.
SpringBoot Version은 2.4.4 버전이다.
@SpringBootApplication
spring-boot-autoconfigure-2.4.4.jar/org/springframework/boot/autoconfigure/SpringBootApplication.java
- @SpringBootConfiguration : 스프링 부트의 설정을 나타내는 어노테이션.
- @EnableAutoConfiguration : 자동 설정의 핵심 어노테이션.
- @ComponentScan : 특정 패키지 경로에서 @Component 설정 클래스를 찾는다. basePackages 프로퍼티 값에 경로를 지정하지 않으면 @ComponentScan을 선언한 위치가 basePackages로 지정된다.
@EnableAutoConfiguration
spring-boot-autoconfigure-2.4.4.jar/org/springframework/boot/autoconfigure/EnableAutoConfiguration.java
EnableAutoConfiguration 클래스에서 자동 설정을 지원해주는 어노테이션은 @Import(AutoConfigurationImportSelector.class) 부분이다.
AutoConfigurationImportSelect Class
해당 클래스에서 여러 필드와 메서드로 인해 간소화했다.
spring-boot-autoconfigure-2.4.4.jar/org/springframework/boot/autoconfigure/AutoConfigurationImportSelector.java
AutoConfigurationImport Selector 클래스는 DeferredImportSelector 인터페이스에서 구현된 selectImports 메서드를 오버라이드한다.
selectImports 메서드에서 자동 설정할 bean을 결정한다.
DeferredImportSelector 인터페이스 내용은 위의 springframework docs으로 확인할 수 있다.
selectImports method
먼저 isEnabled 메서드로 EnableAutoConfiguration.ENABLED_OVERRIDE_PROPERTY가 설정되어 있는지 확인한다.
getAutoConfigurationEntry 메서드에서 bean을 확인한다.
getCandidateConfigurations 메서드에서 SpringFactoriesLoader.loadFactoryNames 메서드로 정의되어 있는 자동 설정할 클래스들을 불러온다. 정의된 클래스들은 spring-boot-autoconfigure-2.4.4.jar/META-INF/spring.factories에 정의되어 있다.
이 정의된 클래스들을 불러오면 여러 스프링 부트 스타터 등록으로 인해 중복된 bean이 자주 일어난다.
그래서 getAutoConfigurationEntry 메서드에서 removeDuplicates, getExclusions 메서드가 제외할 설정과 중복 설정을 제외시킨다.
Bean 등록 및 자동 설정 파일
파일 위치 spring-boot-autoconfigure-2.4.4.jar/
- META-INF/spring.factories : 자동 설정할 정의된 클래스 목록
- META-INF/spring-configuration-metadata.json : 자동 설정에 사용할 프로퍼티가 정의된 목록
자동 설정에 사용할 프로퍼티 값을 추가하려면 application.properties나 application.yml에 추가해주면 된다.
프로퍼티 값은 위의 spring boot docs에서 확인할 수 있다.
'Java & Spring' 카테고리의 다른 글
Java 버전 관리 도구 (0) | 2023.11.18 |
---|---|
[Spring] 인터셉터(Interceptor) 적용 (0) | 2022.04.17 |
JPA @MappedSuperclass (0) | 2022.03.07 |
JWT Token(JSON Web Token) (0) | 2022.03.07 |
JUnit @Before & @After (0) | 2022.03.07 |
댓글