[Back-end]/[Spring]

[Spring Boot] @SpringBootApplication이란?

DevLoki 2021. 9. 14. 18:36

스프링부트 프로젝트를 생성하면 [projectName]Application.java에는 다음과 같이 '@SpringBootApplication'이 있는 걸 확인할 수 있습니다.

@SpringBootApplication이 사용된 Application.java

 

지금부터 @SpringBootApplication의 역할과 내부 구현에 대해서 알아보겠습니다.


[Spring Boot] @SpringBootApplication이란?

 

'/spring-boot-autoconfigure-2.5.4.jar/org/springframework/boot/autoconfigure/SpringBootApplication.java'에 해당 어노테이션이 다음과 같이 정의되어있습니다.

 

@SpringBootApplication 내부 구현

위 어노테이션의 구현을 보면 다음과 같이 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을 실행시켜야 합니다.

 

  1. --debug모드로 실행하려면 application.java파일에서 alt+shift+f10을 눌러 'edit configurations'를 누릅니다.
  2. 'configuration -> environment'에서 다음과 같이 Program arguments에 '--debug'를 입력합니다.

--debug 실행 configuration 설정

 

실행 시 콘솔에 다음과 같이 어떤 auto-configuration이 적용되었는지 확인할 수 있습니다.

auto-configuration console 예시


 

@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가 적용된 클래스들을 스캔하여 자동으로 빈 등록