스프링 부트의 기본적인 설정을 선언해주는 어노테이션으로 해당 어노테이션은 다음과 같은 아노테이션을 포함하고 있다.
@Target(value = {ElementType.TYPE})
@Retention(value = RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
@ComponentScan.Filter(type = FilterType.CUSTOM, classes = {TypeExcludeFilter.class}),
@ComponentScan.Filter(type = FilterType.CUSTOM, classes = {AutoConfigurationExcludeFilter.class})})
public @interface SpringBootApplication {
...
}
@Service, @Repository, @Component, @Controller가 붙은 클래스를 자동으로 탐색해서 빈으로 등록해주는 아노테이션으로 filter를 통해 필요한 클래스에 대해서만 빈으로 등록할 수 있도록 지정되어 있는 상태이다.
스프링 부트에 필요한 클래스들을 자동으로 빈으로 등록하는 옵션을 킨다는 의미의 아노테이션이다.
@Configuration과의 차별점은 자동으로 Configuration을 찾아줘서 단위 테스트와 통합 테스트에서 장점을 가지고 있다.
해당 아노테이션을 사용한 어플리케이션 컨텍스트 설정 클래스에 @ConfiguratonProperties를 사용한 클래스 정보가 빈으로 등록 되기 때문에 프로퍼티 정보가 저장된 클래스를 빈으로 등록할 수 있게 된다.
@Configuration
@EnableConfigurationProperties(AppProperties.class)
public class Configuration {
//Configuration 자체도 빈이기 때문에 다음과 같이
//프로퍼티 객체를 주입받을 수 있다.
@Autowired
private AppProperties appProperties;
//아노테이션 설정만으로 빈으로 등록됐기 때문에
//오토와이어링 없이 바로 사용도 가능하다.
@Bean
public DataSource dataSource(AppProperties appProperties) {
return DataSourceBuilder.create()
.driverClassName(appProperties.getDb_driver_class())
.url(appProperties.getDb_url())
.username(appProperties.getDb_user())
.password(appProperties.getDb_pwd())
.type(MysqlDataSource.class)
.build();
}
}
프로퍼티를 저장하는 POJO에 프로퍼티에 저장된 설정값을 자동으로 주입시켜주는 아노테이션으로 해당 프로퍼티 객체를 빈으로 등록하기 위해서는 @EnableConfigurationProperties에 해당 pojo를 등록한 @Configuration 클래스가 필요한데 pojo 클래스 자신이 @Cofiguration으로 등록해서 사용도 가능하다.
@Getter
@Setter//프로퍼티 값을 주입 받기 위한 필수작업
@ConfigurationProperties(prefix = "additional")
public class AppProperties {
private String unit;//additional.unit 값 주입
private int max;//additional.max 값 주입
}
//별도의 Configuration 클래스 없이 Configuration
//클래스로 자신을 스스로 등록할 수 있다.
@Getter
@Setter
@Configuration
@EnableConfigurationProperties({AppProperties.class})
@PropertySource("application.properties")
@ConfigurationProperties(prefix="dev")
public class AppProperties {
private String customer_blacklist_info;
private String voucher_info;
private String db_driver_class;
private String db_url;
private String db_user;
private String db_pwd;
}
위의 예제 코드를 보면 해당 프로퍼티 설정 클래스의 각 속성에는 application.properties의 값이 주입이 되는데 이때 주입되는 값은 사용자가 명시한 prefix 접두사 + 속성이름에 해당하는 값이 된다.