스프링 부트의 AutoConfiguration

@SpringBootApplication

  • @SpringBootApplication은 스프링부트는 빈을 생성하고 컨텍스트를 만드는 과정을 내포한다. 이 어너테이션은 3개의 어너테이션을 포함한다.
    • @SpringBootConfiguration
    • @EnableAutoConfiguration
    • @ComponentScan
  • @ComponentScan은 해당 클래스 이하의 component에 대하여 빈을 생성한다.
  • @EnableAutoConfiguration은 다양한 Configuration 파일을 읽고 자동으로 빈을 생성한다. /META-INF/spring.factories 의 설정 파일을 기반으로 생성한다.
  • @ComponentScan 수행 후 @EnableAutoConfiguration 을 수행한다. 이 말은 @EnableAutoConfiguration 에서 등록한 빈의 우선순위가 높다는 의미와 같다.

@EnableAutoConfiguration 구현하기

  • @EnableAutoConfiguration 을 실제로 구현한다.
  • spring.factories을 다뤄본다.

라이브러리 생성하기

  • 메이븐에 아래의 디펜던시를 추가하여 @EnableAutoConfiguration 의 대상이 되도록 한다.
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-autoconfigure</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>
  • 아래의 객체를 생성한다.
public class TesterVO {
	private String name;
	private int age;

	public TesterVO(String name, int age) {
		this.name=name;
		this.age=age;
	}

	// 후략 ...
}
  • ConditionalOnMissingBean을 사용하여 혹시 해당 빈이 등록되지 않은 경우 아래의 설정에 따라 등록되도록 한다.
@Configuration
@EnableConfigurationProperties(TesterProperties.class) // properties 를 사용
public class TesterConfig {

	@Bean
	@ConditionalOnMissingBean // ComponentScan 에 우선권을 준다. 
	public TesterVO testerVO(TesterProperties properties) {
		return new TesterVO(properties.getName(), properties.getAge()); 
	}
}
  • 다음은 프로퍼티스 객체이다.
@ConfigurationProperties("test")
@Data
public class TesterProperties {
	private String name;
	private int age;
}

  • spring.factories에서 자동등록할 빈 명세서를 작성한다.
\src\main\resources\META-INF\spring.factories

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ 
spring.config.TesterConfig
  • 마지막으로 maven - install 을 한다.
  • .m2 폴더에 빌드한 파일이 있음을 확인한다.

생성한 라이브러리의 빈을 등록하기

  • 클라이언트 프로젝트를 생성하고, 이전에 생성한 jar를 의존성에 추가한다.
<dependency>
    <groupId>test</groupId>
    <artifactId>spring_config</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>
  • 프로퍼티를 활용하여 아래와 같이 두 가지 방식으로 빈을 등록할 수 있음을 확인한다.
test.name = 'kim'
test.age = 4
@Configuration
public class RunnerConfig {

	@Bean
	public TesterVO testerVO(TesterProperties prop) {
		return new TesterVO("aoi", 66);
	}
}
  • 빈을 잘 등록되었는지 확인한다.
@Autowired
TesterVO testerVO;

@Override
public void run(String... args) throws Exception {
    log.info("====CommandLineRunner====");
    log.info("result : {}", testerVO.toString());
}