Spring/그 외

[Spring] @SpringbootApplication의 원리

ummchicken 2023. 1. 27. 21:01

원래는 MVC1 & MVC2, DispatcherServlet와 같이 담으려 했으나...

내용이 길어지는 관계로 분리 포스팅을 했다.

 

 

 

✔️ @SpringBootApplication이란?

@Configuration + @EnableAutoConfiguration + @ComponentScan을 합친 것이다.

💡 @SpringBootApplication으로 인해
스프링 부트의 자동 설정, 스프링 Bean 읽기와 생성을 모두 자동으로 설정한다.

특히나 @SpringBootApplication이 있는 위치부터 설정을 읽어가기 때문에, 
이 클래스는 항상 프로젝트의 최상단에 위치해야만 한다.

 

 

 

✔️@SpringBootAplication의 내부 구조

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
...

 

 

@SpringBootApplication의 구현을 보면 이 3가지 어노테이션이 명시되어 있다.

  • @SpringBootConfiguration
  • @EnableAutoConfiguration
  • @ComponentScan

 

 

즉, @SpringBootApplication은 위 3가지 어노테이션을 가각 작성하는 것과 동일하게 작동한다.

 

 

 

이제 각 어노테이션을 알아보자.

 

 

 


 

✔️ @SpringBootConfiguration - @Configuration의 용도

@SpringBootConfiguration은 Spring의 @Configuration과 동일한 역할을 수행한다.

@SpringBootConfiguration은 @Configuration의 대안이라고 할 수 있다.
@Configuration은 Spring에 빈 팩토리를 위한 오브젝트 설정을 담당하는 클래스라고 
인식할 수 있도록 알려주는 어노테이션이다.

@Configuration과 거의 같은 일을 하지만, 가장 큰 차이점이라고 하면 
@SpringBootConfiguration을 사용하면 구성을 자동으로 찾을 수 있다는 것이다.
→ 이것은 단위 또는 통합 테스트에 특히 유용할 수 있다.

 

  • 현재 클래스가 Spring의 설정 파일임을 알려주는 어노테이션이다.
  • Configuration을 클래스에 적용하고 @Bean을 해당 클래스의 메소드에 적용하면, @Autowired로 빈을 부를 수 있다.
  • 개발자가 생성한 class를 Bean으로 생성할 때, Singleton으로 한 번만 생성하고, @Component는 Bean을 생성할 때 Java에서 new로 생성하듯이 생성한다.

 

 

 


 

✔️ @EnableAutoConfiguration이란?

@EnableAutoConfiguration은 말 그대로
SpringBoot에서 AutoConfiguration을 가능하게 해주는 어노테이션이다.

@EnableAutoConfiguration은 Spring boot의 핵심으로써, 
미리 정의되어 있는 Bean들을 가져와서 등록해준다.
미리 정의되어 있는 Bean들은 spring-boot-autoconfigure > META-INF > spring.factories에 위치하여 있다.
※ 여기서 SpringBoot AutoConfiguration이란?
Spring Application에서 자동으로 jar dependencies(의존성)를 기반으로 의존성을 설장하는 것을 말한다.

예를 들어, classpath에 HSQLDB가 있을 때 수동으로 데이터베이스 커넥션 빈을 설정해두지 않았다면?
→ SpringBoot는 자동으로 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,\
			.
			.
			.

 

 

 

💡 요약

  • SpringBoot 클래스패스 세팅 및 다양한 Bean 추가 등을 시켜주는 어노테이션
  • 어플리케이션에 추가된 설정들을 자동으로 추가해주는 어노테이션

 

 

 


 

✔️ @ComponentScan이란?

@ComponentScan은 현재 패키지 이하에서
아래와 같은 어노테이션이 붙어 있는 클래스들을 찾아서 빈으로 등록하는 역할을 한다.

(스프링에서 관리하는 POJO를 '빈(Bean)'이라고 한다.)
※ POJO란?
- 특정 기술에 종속되지 않는 순수한 자바 객체를 의미한다.
  • @Component
  • @Configuration
  • @Repository
  • @Service
  • @Controller
  • @RestController

 

 

스프링은 기본적으로 객체를 자동으로 생성하여 관리하기 때문에

@Component 어노테이션이 있는 클래스들을 스프링 컨테이너가 생성해준다.

 

@ComponentScan은 특별히 basePackage를 지정하지 않아도,

main class가 위치한 패키지를 Root package로 하여 그 이하의 모든 컴포넌트 클래스들을 검색하며 빈으로 등록한다.

(메인 클래스인 MyrecipeApplication를 보면, 이 클래스는 com.myrecipe 패키지에 있다.

이 패키지가 컴포넌트 스캔의 루트패키지가 된다. 

따라서 com.myrecipe 패키지를 기준으로 그 하위에 있는(== 하위 패키지) 모든 컴포넌트들을 검색한다.)

 

 

 


 

✔️ 정리

  • @SpringBootApplication = @SpringBootConfiguration + @EnableAutoConfiguration + @ComponentScan
  • @SpringBootConfiguration : 사용자가 추가적으로 빈이나 설정 클래스들을 등록 가능하게 함
  • @EnableAutoConfiguration  : jar properties를 기반으로 자동으로 의존성 설정
  • @ComponentScan : @Component가 적용된 클래스들을 스캔하여 자동으로 빈 등록

 

 

❓ Q. @SpringBootApplication 어노테이션은 무슨 일을 하나요?

→ A. @SpringBootApplication으로 인해
스프링 부트의 자동 설정, 스프링 Bean 읽기와 생성을 모두 자동으로 설정한다.
특히나 @SpringBootApplication이 있는 위치부터 설정을 읽어가기 때문에, 
이 클래스는 항상 프로젝트의 최상단에 위치해야만 한다.

 

 

 

 

 


출처