원래는 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이 있는 위치부터 설정을 읽어가기 때문에,
이 클래스는 항상 프로젝트의 최상단에 위치해야만 한다.
출처
- https://mand2.github.io/spring/spring-boot/4/
- https://yejun-the-developer.tistory.com/3
- https://coooding.tistory.com/33
'Spring > 그 외' 카테고리의 다른 글
[Spring] 서블릿 필터 & 핸들러 인터셉터 (0) | 2023.02.08 |
---|---|
[Spring] 스프링 성능 최적화에 대한 고찰 (0) | 2023.01.24 |
[Spring] 왜 스프링을 쓰는가? (특징 & 계층 구조) (0) | 2023.01.23 |
Spring(스프링) 주요 어노테이션 정리 (0) | 2023.01.22 |
Dto, Controller, Service (0) | 2023.01.07 |