본문 바로가기

Spring/공부공부

[Spring Boot] @SpringBootApplication

 

 

스프링부트 메인클래스에는 아래처럼 @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 Boot] 구조 분석(1) - @SpringBootApplication 이란?

- 지난 시간 안녕하세요. 지난 시간에는 아주 간단하게 Spring Boot API 서버를 만들어 봤습니다. 처음 Spring Boot를 접하시는 분들은 아래 링크를 통해 학습하고 오시는 걸 추천드리겠습니다. [Spring Boo

any-ting.tistory.com