- Spring Boot에서 제공하는 Starter 모듈을 의존성으로 사용하면, 관련 객체의 Auto-Configuration 라이브러리가 함께 제공됩니다.
- Spring Boot는 Auto-Configuration 라이브러리를 픽업하여 자동 설정을 적용합니다.
1. Understanding Auto-configured Beans
항목 | 설명 |
@AutoConfigure* 어노테이션 |
관련 자동 설정을 활성화하는 역할 (마커 어노테이션)
|
자동설정 클래스 네이밍 |
*AutoConfiguration 패턴을 따르며, 클래스에 @AutoConfiguration 어노테이션이 붙음
|
자동설정 활성화 방식 |
자동설정 클래스의 메서드를 실행하여 관련 설정을 자동 적용
|
Bean 등록 |
각 메서드는 관련된 컴포넌트를 @Bean으로 등록함
|
조건부 설정 제어 어노테이션 | 특정 조건에 따라 설정 적용 여부를 제어함 ex) @Conditional, @ConditionalOnClass, @ConditionalOnMissingBean |
코드) AopAutoConfiguration
더보기
@AutoConfiguration
@ConditionalOnProperty(prefix = "spring.aop", name = "auto", havingValue = "true", matchIfMissing = true)
public class AopAutoConfiguration {
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(Advice.class)
static class AspectJAutoProxyingConfiguration {
@Configuration(proxyBeanMethods = false)
@EnableAspectJAutoProxy(proxyTargetClass = false)
@ConditionalOnProperty(prefix = "spring.aop", name = "proxy-target-class", havingValue = "false")
static class JdkDynamicAutoProxyConfiguration {
}
@Configuration(proxyBeanMethods = false)
@EnableAspectJAutoProxy(proxyTargetClass = true)
@ConditionalOnProperty(prefix = "spring.aop", name = "proxy-target-class", havingValue = "true", matchIfMissing = true)
static class CglibAutoProxyConfiguration {
}
}
@Configuration(proxyBeanMethods = false)
@ConditionalOnMissingClass("org.aspectj.weaver.Advice")
@ConditionalOnProperty(prefix = "spring.aop", name = "proxy-target-class", havingValue = "true", matchIfMissing = true)
static class ClassProxyingConfiguration {
@Bean
static BeanFactoryPostProcessor forceAutoProxyCreatorToUseClassProxying() {
return (beanFactory) -> {
if (beanFactory instanceof BeanDefinitionRegistry registry) {
AopConfigUtils.registerAutoProxyCreatorIfNecessary(registry);
AopConfigUtils.forceAutoProxyCreatorToUseClassProxying(registry);
}
};
}
}
}
2. Locating Auto-configuration Candidates
항목 | 설명 |
자동설정 클래스 위치 |
.imports 파일로부터 제공됨
|
.imports 파일 위치 | spring-boot-*-autoconfigure의 META-INF/spring 경로에 존재 형식: org.springframework.boot.autoconfigure.*.AutoConfiguration.imports |
핵심 어노테이션 흐름 |
@AutoConfigure*
→ @ImportAutoConfiguration → @Import(ImportAutoConfigurationImportSelector.class) → ImportAutoConfigurationImportSelector가 .imports 파일을 읽어서 자동설정 클래스 Import |
자동설정 클래스 구성 방식 |
@Import만 허용
(@Component, @Service 등 컴포넌트 스캔 관련 어노테이션은 허용되지 않음) |
설정 순서 지정 어노테이션 |
@AutoConfiguration의 속성으로 설정 가능
|
순서 제어용 어노테이션 |
@AutoConfigureBefore, @AutoConfigureAfter
→ before, beforeName, after, afterName 속성 사용 가능 |
명시적 순서 지정 |
@AutoConfigureOrder를 통해 명시적으로 자동 설정 순서 지정 가능
|
빈 생성 순서 제어 |
@DependsOn 어노테이션을 통해 Spring에 빈 간 의존성 힌트 제공 가능
→ 빈 정의 순서 ≠ 실제 생성 순서 (의존관계에 따라 결정됨) |
파일) META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguation.imports
더보기
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration
org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration
org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration
org.springframework.boot.autoconfigure.context.LifecycleAutoConfiguration
org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration
org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration
org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration
org.springframework.boot.autoconfigure.dao.PersistenceExceptionTranslationAutoConfiguration
org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration
org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveDataAutoConfiguration
org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveRepositoriesAutoConfiguration
org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseReactiveDataAutoConfiguration
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseReactiveRepositoriesAutoConfiguration
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseRepositoriesAutoConfiguration
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration
org.springframework.boot.autoconfigure.data.elasticsearch.ReactiveElasticsearchRepositoriesAutoConfiguration
org.springframework.boot.autoconfigure.data.jdbc.JdbcRepositoriesAutoConfiguration
org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration
org.springframework.boot.autoconfigure.data.ldap.LdapRepositoriesAutoConfiguration
org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration
org.springframework.boot.autoconfigure.data.mongo.MongoReactiveDataAutoConfiguration
org.springframework.boot.autoconfigure.data.mongo.MongoReactiveRepositoriesAutoConfiguration
org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration
org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration
org.springframework.boot.autoconfigure.data.neo4j.Neo4jReactiveDataAutoConfiguration
org.springframework.boot.autoconfigure.data.neo4j.Neo4jReactiveRepositoriesAutoConfiguration
org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration
org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration
org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration
org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration
org.springframework.boot.autoconfigure.data.redis.RedisReactiveAutoConfiguration
org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration
org.springframework.boot.autoconfigure.data.rest.RepositoryRestMvcAutoConfiguration
org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration
org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchClientAutoConfiguration
org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchRestClientAutoConfiguration
org.springframework.boot.autoconfigure.elasticsearch.ReactiveElasticsearchClientAutoConfiguration
org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration
org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration
org.springframework.boot.autoconfigure.graphql.GraphQlAutoConfiguration
org.springframework.boot.autoconfigure.graphql.data.GraphQlReactiveQueryByExampleAutoConfiguration
org.springframework.boot.autoconfigure.graphql.data.GraphQlReactiveQuerydslAutoConfiguration
org.springframework.boot.autoconfigure.graphql.data.GraphQlQueryByExampleAutoConfiguration
org.springframework.boot.autoconfigure.graphql.data.GraphQlQuerydslAutoConfiguration
org.springframework.boot.autoconfigure.graphql.reactive.GraphQlWebFluxAutoConfiguration
org.springframework.boot.autoconfigure.graphql.rsocket.GraphQlRSocketAutoConfiguration
org.springframework.boot.autoconfigure.graphql.rsocket.RSocketGraphQlClientAutoConfiguration
org.springframework.boot.autoconfigure.graphql.security.GraphQlWebFluxSecurityAutoConfiguration
org.springframework.boot.autoconfigure.graphql.security.GraphQlWebMvcSecurityAutoConfiguration
org.springframework.boot.autoconfigure.graphql.servlet.GraphQlWebMvcAutoConfiguration
org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration
org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration
org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration
org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration
org.springframework.boot.autoconfigure.hazelcast.HazelcastAutoConfiguration
org.springframework.boot.autoconfigure.hazelcast.HazelcastJpaDependencyAutoConfiguration
org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration
org.springframework.boot.autoconfigure.http.codec.CodecsAutoConfiguration
org.springframework.boot.autoconfigure.influx.InfluxDbAutoConfiguration
org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration
org.springframework.boot.autoconfigure.integration.IntegrationAutoConfiguration
org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration
org.springframework.boot.autoconfigure.jdbc.JndiDataSourceAutoConfiguration
org.springframework.boot.autoconfigure.jdbc.XADataSourceAutoConfiguration
org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration
org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration
org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration
org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration
org.springframework.boot.autoconfigure.jms.JndiConnectionFactoryAutoConfiguration
org.springframework.boot.autoconfigure.jms.artemis.ArtemisAutoConfiguration
org.springframework.boot.autoconfigure.jooq.JooqAutoConfiguration
org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration
org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration
org.springframework.boot.autoconfigure.availability.ApplicationAvailabilityAutoConfiguration
org.springframework.boot.autoconfigure.ldap.embedded.EmbeddedLdapAutoConfiguration
org.springframework.boot.autoconfigure.ldap.LdapAutoConfiguration
org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration
org.springframework.boot.autoconfigure.mail.MailSenderAutoConfiguration
org.springframework.boot.autoconfigure.mail.MailSenderValidatorAutoConfiguration
org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration
org.springframework.boot.autoconfigure.mongo.MongoReactiveAutoConfiguration
org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration
org.springframework.boot.autoconfigure.neo4j.Neo4jAutoConfiguration
org.springframework.boot.autoconfigure.netty.NettyAutoConfiguration
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration
org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration
org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration
org.springframework.boot.autoconfigure.r2dbc.R2dbcTransactionManagerAutoConfiguration
org.springframework.boot.autoconfigure.rsocket.RSocketMessagingAutoConfiguration
org.springframework.boot.autoconfigure.rsocket.RSocketRequesterAutoConfiguration
org.springframework.boot.autoconfigure.rsocket.RSocketServerAutoConfiguration
org.springframework.boot.autoconfigure.rsocket.RSocketStrategiesAutoConfiguration
org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration
org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration
org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration
org.springframework.boot.autoconfigure.security.reactive.ReactiveSecurityAutoConfiguration
org.springframework.boot.autoconfigure.security.reactive.ReactiveUserDetailsServiceAutoConfiguration
org.springframework.boot.autoconfigure.security.rsocket.RSocketSecurityAutoConfiguration
org.springframework.boot.autoconfigure.security.saml2.Saml2RelyingPartyAutoConfiguration
org.springframework.boot.autoconfigure.sendgrid.SendGridAutoConfiguration
org.springframework.boot.autoconfigure.session.SessionAutoConfiguration
org.springframework.boot.autoconfigure.security.oauth2.client.servlet.OAuth2ClientAutoConfiguration
org.springframework.boot.autoconfigure.security.oauth2.client.reactive.ReactiveOAuth2ClientAutoConfiguration
org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerAutoConfiguration
org.springframework.boot.autoconfigure.security.oauth2.resource.reactive.ReactiveOAuth2ResourceServerAutoConfiguration
org.springframework.boot.autoconfigure.sql.init.SqlInitializationAutoConfiguration
org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration
org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration
org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration
org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration
org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfiguration
org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration
org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration
org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration
org.springframework.boot.autoconfigure.web.reactive.HttpHandlerAutoConfiguration
org.springframework.boot.autoconfigure.web.reactive.ReactiveMultipartAutoConfiguration
org.springframework.boot.autoconfigure.web.reactive.ReactiveWebServerFactoryAutoConfiguration
org.springframework.boot.autoconfigure.web.reactive.WebFluxAutoConfiguration
org.springframework.boot.autoconfigure.web.reactive.WebSessionIdResolverAutoConfiguration
org.springframework.boot.autoconfigure.web.reactive.error.ErrorWebFluxAutoConfiguration
org.springframework.boot.autoconfigure.web.reactive.function.client.ClientHttpConnectorAutoConfiguration
org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration
org.springframework.boot.autoconfigure.websocket.reactive.WebSocketReactiveAutoConfiguration
org.springframework.boot.autoconfigure.websocket.servlet.WebSocketServletAutoConfiguration
org.springframework.boot.autoconfigure.websocket.servlet.WebSocketMessagingAutoConfiguration
org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration
org.springframework.boot.autoconfigure.webservices.client.WebServiceTemplateAutoConfiguration
파일) META-INF/spring/org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureJdbc.imports
더보기
# AutoConfigureJdbc auto-configuration imports
org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration
org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration
org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration
org.springframework.boot.autoconfigure.sql.init.SqlInitializationAutoConfiguration
org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration
코드) @AutoConfigureJson
더보기
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@ImportAutoConfiguration
public @interface AutoConfigureJson {
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(ImportAutoConfigurationImportSelector.class)
public @interface ImportAutoConfiguration {
/**
* The auto-configuration classes that should be imported. This is an alias for
* {@link #classes()}.
* @return the classes to import
*/
@AliasFor("classes")
Class<?>[] value() default {};
/**
* The auto-configuration classes that should be imported. When empty, the classes are
* specified using a file in {@code META-INF/spring} where the file name is the
* fully-qualified name of the annotated class, suffixed with '.imports'.
* @return the classes to import
*/
@AliasFor("value")
Class<?>[] classes() default {};
/**
* Exclude specific auto-configuration classes such that they will never be applied.
* @return the classes to exclude
*/
Class<?>[] exclude() default {};
}
3. Condition Annotations
- Spring Boot는 빈 등록 혹은 설정클래스의 활성화의 조건을 명시하기 위해 여러 @Conditional 어노테이션을 제공합니다.
- @Configuration (설정 클래스)에 적용되는 어노테이션입니다.
조건 유형 | 어노테이션 | 설명 | 주요 속성 |
클래스 조건
|
@ConditionalOnClass | 클래스가 클래스패스에 존재할 경우 적용 | value, name |
@ConditionalOnMissingClass | 클래스가 클래스패스에 없을 경우 적용 | value, name | |
빈 조건
|
@ConditionalOnBean | 해당 타입의 빈이 존재할 경우 적용 |
value, name, search
|
@ConditionalOnMissingBean | 해당 타입의 빈이 존재하지 않을 경우 적용 |
value, name, search
|
|
프로퍼티 조건 | @ConditionalOnProperty | Config Data의 특정 속성 값이 일치할 때 |
prefix, name, havingValue,
matchIfMissing |
리소스 조건 | @ConditionalOnResource | 특정 리소스 파일이 존재할 경우 적용 | resources |
웹 조건
|
@ConditionalOnWebApplication | 현재 환경이 웹 애플리케이션일 경우 적용 |
type
(SERVLET, REACTIVE 등) |
@ConditionalOnNotWebApplication | 현재 환경이 웹 애플리케이션이 아닐 경우 | - | |
WAR 조건
|
@ConditionalOnWarDeployment | 배포 형태가 전통적인 WAR일 경우 적용 | - |
@ConditionalOnNotWarDeployment | 배포 형태가 WAR가 아닐 경우 적용 | - | |
SpEL 조건 | @ConditionalOnExpression | SpEL 표현식이 true일 경우 적용 |
value (SpEL 식)
|
예제) 클래스 조건
더보기

@Configuration
public class JacksonPresentConfig {
@Bean
@ConditionalOnClass(name = "com.fasterxml.jackson.databind.ObjectMapper")
public String jsonEnabledBean() {
return "ObjectMapper is present!";
}
@Bean
@ConditionalOnMissingClass("com.fasterxml.jackson.databind.ObjectMapper")
public String jsonDisabledBean() {
return "ObjectMapper is NOT present!";
}
}
@RestController
public class HelloController {
private final String jsonEnabledBean;
private final String jsonDisabledBean;
public HelloController(@Autowired(required = false) @Qualifier("jsonEnabledBean") String jsonEnabledBean,
@Autowired(required = false) @Qualifier("jsonDisabledBean") String jsonDisabledBean) {
this.jsonEnabledBean = jsonEnabledBean;
this.jsonDisabledBean = jsonDisabledBean;
}
}
@GetMapping("/conditional")
public String conditionalTest() {
System.out.println("jsonEnabledBean: " + jsonEnabledBean);
System.out.println("jsonDisabledBean: " + jsonDisabledBean);
return null;
}

예제) 빈 조건
더보기
@Configuration
public class BeanConfig {
@Bean
@ConditionalOnBean(AppLifecycleLogger.class)
public String appLifecycleLoggerExists() {
return "AppLifecycleLogger is exist!";
}
@Bean
@ConditionalOnMissingBean(AppLifecycleLogger.class)
public String appLifecycleLoggerNotExists() {
return "AppLifecycleLogger is non-exist!";
}
}
예제) 프로퍼티 조건
더보기
@Configuration
public class BeanConfig {
@Bean
@ConditionalOnProperty(prefix = "my.feature", name = "enabled", havingValue = "true", matchIfMissing = true)
public String myFeature() {
return "my.feature.enabled is true";
}
}
예제) 리소스 조건
더보기
@Bean
@ConditionalOnResource(resources = "classpath:custom-config.properties")
public String customConfig() {
return "custom-config.properties is exist!";
}
예제) 웹 조건
더보기
@Bean
@ConditionalOnWebApplication
public String isWebApp() {
return "web application";
}
- Spring Web or Spring Boot Web 일때만 동작
예제) WAR 조건
더보기
@Configuration
@ConditionalOnWarDeployment
public class WarOnlyConfig {
@Bean
public WarService warService() {
return new WarService();
}
}
예제) SpEL 조건
더보기
@Configuration
@ConditionalOnExpression("${feature.enabled:true} and ${env.profile} == 'dev'")
public class DevFeatureConfig {
@Bean
public DevFeatureService devFeatureService() {
return new DevFeatureService();
}
}
참고
'Spring > Spring Boot' 카테고리의 다른 글
[Spring Boot] 4. Data: SQL Databases (0) | 2023.10.13 |
---|---|
[Spring Boot] 3. Web: Servlet Web Application (0) | 2023.10.12 |
[Spring Boot] 2-6. Core Features: JSON (0) | 2023.10.09 |
[Spring Boot] 2-3. Core Features: Profile (0) | 2023.10.09 |
[Spring Boot] 2-2. Core Features: Externalized Configuration (2) | 2023.10.09 |