스프링부트 프로젝트를 생성하면 [projectName]Application.java에는 다음과 같이 '@SpringBootApplication'이 있는 걸 확인할 수 있습니다.
지금부터 @SpringBootApplication의 역할과 내부 구현에 대해서 알아보겠습니다.
[Spring Boot] @SpringBootApplication이란?
'/spring-boot-autoconfigure-2.5.4.jar/org/springframework/boot/autoconfigure/SpringBootApplication.java'에 해당 어노테이션이 다음과 같이 정의되어있습니다.
위 어노테이션의 구현을 보면 다음과 같이 3가지 어노테이션이 명시되어 있습니다.
- @SpringBootConfiguration
- @EnableAutoConfiguration
- @ComponentScan
즉, @SpringBootApplication은 위 3가지 어노테이션을 각각 작성하는 것과 동일하게 작동하는 것을 알 수 있습니다.
이제 각 어노테이션의 역할을 알아보겠습니다.
@EnableAutoConfiguration
@EnableAutoConfiguration은 말 그대로 Spring boot에서 AutoConfiguration을 가능하게 해주는 어노테이션입니다.
여기서 Spring Boot AutoConfiguration이란 Spring Application에서 자동으로 jar dependencies(의존성:두 모듈 간의 관계)를 기반으로 의존성을 설정하는 것을 말합니다.
예를 들어, classpath에 HSQLDB가 있을 때 수동으로 데이터베이스 커넥션 빈을 설정해 두지 않았다면 spring boot는 자동으로 in-memory database를 설정해 둡니다.
'/spring-boot-autoconfigure-2.4.4.jar/META-INF/spring.factories' 에서 AutoConfiguration들을 확인할 수 있습니다.
# Auto Configuration Import Listeners
org.springframework.boot.autoconfigure.AutoConfigurationImportListener=\
org.springframework.boot.autoconfigure.condition.ConditionEvaluationReportAutoConfigurationImportListener
# Auto Configuration Import Filters
org.springframework.boot.autoconfigure.AutoConfigurationImportFilter=\
org.springframework.boot.autoconfigure.condition.OnBeanCondition,\
org.springframework.boot.autoconfigure.condition.OnClassCondition,\
org.springframework.boot.autoconfigure.condition.OnWebApplicationCondition
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
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,\
.
.
.
현재 프로젝트에서 어떤 auto-configuration이 적용되고 있는지 확인하려면 --debug로 app을 실행시켜야 합니다.
- --debug모드로 실행하려면 application.java파일에서 alt+shift+f10을 눌러 'edit configurations'를 누릅니다.
- 'configuration -> environment'에서 다음과 같이 Program arguments에 '--debug'를 입력합니다.
실행 시 콘솔에 다음과 같이 어떤 auto-configuration이 적용되었는지 확인할 수 있습니다.
@ComponentScan
다음은 @ComponentScan입니다.
@ComponentScan은 @Component, @Service, @Repository와 @Controller가 적용된 클래스들을 스캔하여 자동으로 빈으로 등록해 주는 역할을 수행합니다.
@ComponentScan에 사용할 수 있는 태그는 다음과 같습니다.
- includeFilters : 해당 클래스들을 컴포넌트 스캔 대상에 포함합니다.
- excludeFilters : 해당 클래스들을 컴포넌트 스캔 대상에서 제외합니다.
- basePackages : basePackages에 직접 경로를 설정하지 않았다면 이 어노테이션이 명시된 클래스(application.java)가 있는 패키지가 기본 경로로 설정되며 해당 패키지와 하위 패키지들을 스캔하여 빈으로 등록합니다.
@SpringBootConfiguration
@SpringBootConfiguration은 Spring의 @Configuration과 동일한 역할을 수행합니다.
해당 어노테이션이 적용된 클래스가 하나 이상의 @Bean 메서드를 선언하며 런타임 시 요청에 따라 스프링 컨테이너에 의해 처리될 수 있음을 나타냅니다. 즉, 사용자가 추가적으로 빈이나 설정 클래스들을 등록할 수 있도록 해줍니다.
정리
@SpringBootApplication = @SpringBootConfiguration + @EnableAutoConfiguration + @ComponentScan
- @SpringBootConfiguration : 사용자가 추가적으로 빈이나 설정 클래스들을 등록 가능하게 함
- @EnableAutoConfiguration : jar properties를 기반으로 자동으로 의존성 설정
- @ComponentScan : @Component가 적용된 클래스들을 스캔하여 자동으로 빈 등록
'[Back-end] > [Spring]' 카테고리의 다른 글
[Spring] 스프링의 빈후처리기(AnnotationAwareAspectJAutoProxyCreator) (0) | 2021.12.07 |
---|---|
[Spring] 빈 후처리기(BeanPostProcessor) (0) | 2021.12.05 |
[Spring] 다이내믹 프록시(DynamicProxy) (1) | 2021.11.30 |
[Spring] 프록시와 디자인패턴 (1) | 2021.11.30 |
[Spring] DispatcherServlet이란? (0) | 2021.09.18 |