스프링부트 메인클래스에는 아래처럼 @SpringBootApplication 어노테이션이 붙어있다.
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
스프링의 다양한 기능을 자동으로 설정하고, 이를 기반으로 애플리케이션 전체를 실행할 수 있도록 돕는 역할!
따라서, @SpringBootApplication 가 붙은 메인 클래스가 스프링 부트 애플리케이션의 진입점이다.
main() 메서드에서 SpringApplication.run() 메서드를 호출하면
스프링 컨테이너가 초기화되고, 등록된 빈들과 설정들이 실행되면서 애플리케이션이 돌아가게 된다.
* 이 메인클래스를 잡지 못하면 애플리케이션 실행이 안된다.
svn에서 프로젝트 체크아웃 이후 실행이 안된 적이 있었는데, 이 메인 클래스를 잡지 못해서였다.
( IntelliJ ) Run - Edit Configurations 에서 해당 클래스를 메인으로 지정해주면 해결!
* SpringBootApplication.class 구성
@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 {
@AliasFor(
annotation = EnableAutoConfiguration.class
)
Class<?>[] exclude() default {};
@AliasFor(
annotation = EnableAutoConfiguration.class
)
String[] excludeName() default {};
@AliasFor(
annotation = ComponentScan.class,
attribute = "basePackages"
)
String[] scanBasePackages() default {};
@AliasFor(
annotation = ComponentScan.class,
attribute = "basePackageClasses"
)
Class<?>[] scanBasePackageClasses() default {};
@AliasFor(
annotation = ComponentScan.class,
attribute = "nameGenerator"
)
Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class;
@AliasFor(
annotation = Configuration.class
)
boolean proxyBeanMethods() default true;
}
@Target
어노테이션이 적용 가능한 대상을 제한.
- ElementType.TYPE : 클래스, 인터페이스, 열거형(ENUM) 등에 적용 가능.
@Retention
어노테이션이 어디까지 유지되는지를 정의.
- RetentionPolicy.RUNTIME : 어노테이션이 런타임까지 유지되며, 리플렉션을 통해 접근 가능.
=> 스프링이 이 어노테이션을 런타임에 읽어서 설정을 적용할 수 있는 이유.
@Documented
이 어노테이션이 JavaDoc에 포함되도록 지정. => 문서화할 때, 해당 어노테이션이 적용되었음을 명시.
@Inherited (클래스에만 적용. 인터페이스X)
이 어노테이션이 부모 클래스에 선언되어 있으면, 자식 클래스에서 자동으로 상속되도록 지정.
( @SpringBootApplication이 선언되어 있으면 자식 클래스도 이를 인식 )
@SpringBootConfiguration *
이 클래스가 스프링 부트 애플리케이션의 설정 클래스임을 나타냄.
=> 내부적으로 @Configuration 을 상속.
@EnableAutoConfiguration
스프링부트의 자동설정(Auto Configuration) 활성화.
- exclude / excludeName 속성으로 자동설정 제외 가능
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@ComponentScan
지정된 패키지와 그 하위 패키지를 스캔해서
@Component, @Configuration, @Service, @Repository, @Controller 어노테이션이 붙은 클래스를
스프링 컨테이너에 빈(bean)으로 등록.
- excludeFilters 속성으로 스캔에서 제외할 빈의 조건 필터링.
(특정 어노테이션 제외)
@ComponentScan(
basePackages = "com.example.myapp",
excludeFilters = @ComponentScan.Filter(
type = FilterType.ANNOTATION,
classes = MyCustomAnnotation.class
)
)
=> 스캔 대상에서 @MyCustomAnnotation 이 붙은 클래스 제외
(특정 클래스 타입 제외)
@ComponentScan(
basePackages = "com.example.myapp",
excludeFilters = @ComponentScan.Filter(
type = FilterType.ASSIGNABLE_TYPE,
classes = MyService.class
)
)
=> 스캔 대상에서 MyService 클래스 제외
(특정 클래스 타입 제외)
@ComponentScan(
basePackages = "com.example.myapp",
excludeFilters = @ComponentScan.Filter(
type = FilterType.REGEX,
pattern = ".*MyExcludedClass.*"
)
)
=> 스캔 대상에서 MyExcludedClass 가 포함된 모든 클래스 제외
** 이외에도 특정 조건에 맞는 클래스만 제외하는 사용자 정의 필터 설정 가능~
* SpringBootConfiguration.class 구성
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
@Indexed
public @interface SpringBootConfiguration {
@AliasFor(
annotation = Configuration.class
)
boolean proxyBeanMethods() default true;
}
@Configuration
스프링의 Java 기반 설정 클래스를 나타내며,
이 클래스 안에 정의된 메서드들은 빈(bean)으로 등록된다.
@Configuration
public class AppConfig {
@Bean
public MyBean myBean() {
return new MyBean();
}
}
@Indexed
컴포넌트 스캔 최적화.
스프링은 클래스 경로를 순차적으로 스캔하면서,
빈 등록 대상이 되는 클래스들(@Component, @Configuration, @Service)을 찾는다.
@Indexed 를 사용하면 메타데이터가 기록되어, 클래스 경로 전체를 스캔하지 않고 대상 클래스들을 빠르게 찾을 수 있다.
즉, @SpringBootConfiguration 이 붙은 클래스가 빠르게 검색되도록 메타데이터를 생성하는 역할.
** 스프링부트는 spring-context-indexer 라는 도구로 META-INF/spring.components 파일을 생성하는데,
이 파일을 활용해서 애플리케이션 시작 시간을 단축!!
https://any-ting.tistory.com/143
'Spring > 공부공부' 카테고리의 다른 글
[Spring Boot / IntelliJ] bootJar & MANIFEST.MF (0) | 2024.12.22 |
---|---|
[Spring] Quartz 스케줄러 (0) | 2024.11.26 |
[Spring] @Async 비동기 처리 ( SimpleAsyncTaskExecutor ) (0) | 2024.10.24 |
[Spring] 뷰 리졸버(View Resolver) 설정 (https 오류) (0) | 2024.09.25 |
[Spring / HTTP] ResponseEntity (0) | 2024.06.20 |