스프링 부트의 자동 구성
스프링 부트는 자동 구성(Auto Configuration)이라는 기능을 제공해서,
DataSource, TransactionManger과 같은 일반적으로 자주 사용하는 수많은 빈들을 자동으로 등록해준다.
자동 구성 덕분에 개발자는 반복적이고 복잡한 빈 등록과 설정을 최소화 하고 애플리케이션 개발을 빠르게 시작할 수 있다.
스프링 부트는 spring-boot-autoconfigure라는 프로젝트 안에서 수 많은 자동 구성을 제공한다.
- @AutoConfiguration: 자동 구성을 사용하려면 이 애노테이션을 등록해야 한다. 이 애노테이션을 살펴보면 메타 애노테이션으로 @Configuration을 가지고 있으므로 빈을 등록하는 자바 설정 파일로 사용할 수 있다. after의 의미는 자동 구성이 실행되는 순서를 지정한 것이다.
- @ConditionalXxxx: IF문과 유사한 기능을 제공한다. 자동 구성의 핵심이다.
- @Import: 스프링에서 자바 설정을 추가할 때 사용한다.
@Conditional
같은 소스 코드인데 특정 상황일 때만 특정 빈들을 등록해서 사용하도록 도와주는 기능이 바로 @Conditional이다.
이 기능을 사용하려면 Condition 인터페이스를 구현해서 사용해야 한다.
스프링은 이미 수많은 @Conditional 시리즈를 제공하고 있다. 몇가지만 살펴보자.
- @ConditionalClass: 클래스가 있는 경우에만 동작한다.
- @ConditionalOnProperty: 환경 정보가 있는 경우에만 동작한다.
- @ConditionalOnResource: 리소스가 있는 경우에만 동작한다.
- @ConditionalOnWebApplication: 웹 애플리케이션인 경우 동작한다.
@AutoConfiguration
스프링 부트가 제공하는 자동 구성 기능을 적용할 때 사용하는 애노테이션이다.
자동 구성 대상 지정
스프링 부트 자동 구성을 적용하려면, 다음 파일에 자동 구성 대상을 꼭 지정해주어야 한다.
그래야만 스프링 부트가 파일을 읽어서 스프링 부트 자동 구성으로 사용한다.
src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
위 파일에 자동 구성 클래스의 패키지를 포함해서 지정해야 한다.
ImportSelector
@EnableAutoConfiguration 애노테이션이 붙어있어야 자동 구성을 활성화된다.
@SpringBootApplication은 메타 애노테이션으로 @EnableAutoConfiguration를 가지고 있다.
그러면 여기에서 AutoConfigurationImportSelector가 보이는데 이는 ImportSelector의 구현체다.
@Import(ImportSelector)를 사용하면 코드로 프로그래밍해서 설정으로 사용할 대상을 동적으로 지정할 수 있다.
AutoConfigurationImportSelector는 ImportSelector의 구현체이므로 설정 정보를 동적으로 선택할 수 있다.
실제로 이 코드는 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 경로의 파일을 확인한다. 그리고 파일을 읽어서 설정 정보로 선택한다.
코드를 좀 더 살펴보았다.
그럼 ImportCandidates 클래스의 정적 메서드 load가 보인다. 들어가서 살펴보자.
위 메서드를 우리의 실습에 대입해보면 여기서 아래 경로에 있는 파일을 찾아서 자동 구성을 지정할 클래스의 이름을 리턴할 수 있게 해준다.
src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
빈 등록 후 설정 정보 세팅
이렇게 스프링 빈의 자동 등록을 살펴보았다. 그럼 빈을 등록할 때 설정 정보는 어떻게 입력해야 할까??
이는 아래 포스팅에서 나오는 @ConfigurationProperties를 사용한 것이다.
https://devdebin.tistory.com/276
@ConfigurationProperties를 사용하면 빈 후처리기를 통해서 스프링 빈으로 등록 후 설정 값을 주입해준다고 한다.
이상으로 포스팅을 마칩니다. 감사합니다.
참고 자료
댓글