티스토리 뷰

728x90

스프링부트 프로젝트를 처음 생성하면 Application에 작성되어있는 main 

이 한줄로 웹 애플리케이션을 실행하고 자동 설정 파일을 읽어서 가져온다.

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}

@SpringBootApplication 를 타고 들어가본다.

@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 {
	....(생략)
}

여기서 중요한 애노테이션은 @SpringBootConfiguration@EnableAutoConfiguration@ComponentScan이다.

 

스프링 부트를 실행하면 빈은 두 단계로 나눠서 읽힌다.

(참고로 스프링 부트에서 빈을 읽을때에는  @SpringBootApplication 애노테이션이 위치한 패키지를 기준으로 하위 패키지에 등록되어있는 빈을 모두 수집한다.)

 

첫번째로 @ComponentScan을 통해서 클래스에 Component라는 애노테이션이 붙어있는 클래스들을 모두 수집한다.

웹 애플리케이션을 개발하면서 자주 쓰는 @Controller, @Service, @Repository, @Configuration ... 등이 모두 해당된다.

 

대표적으로 @Controller만 살펴보자면 @Component 애노테이션이 붙어있는 것을 확인할 수 있다.

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {
    @AliasFor(
        annotation = Component.class
    )
    String value() default "";
}

@EnableAutoConfiguration이 하는 역할은 spring-boot-autoconfigure안에 META-INF 밑에 있는 spring.fatories안에 들어있는 많은 자동 설정들을 조건에 따라서 등록시키는 역할을 한다.

@EnableAutoConfiguration 애노테이션이 읽어 들이는 빈은 @ComponentScan이  빈을 다 등록한 다음에 추가적인 빈을 등록해주는 것이다. 그래서 두 단계로 빈을 읽는다고 한 것이다.

 

spring.factories를 살펴보면..

# Initializers
org.springframework.context.ApplicationContextInitializer=\
org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer,\
org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener

# Application Listeners
org.springframework.context.ApplicationListener=\
org.springframework.boot.autoconfigure.BackgroundPreinitializer

# 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,\

....(생략)

# Failure analyzers
org.springframework.boot.diagnostics.FailureAnalyzer=\
org.springframework.boot.autoconfigure.data.redis.RedisUrlSyntaxFailureAnalyzer,\
org.springframework.boot.autoconfigure.diagnostics.analyzer.NoSuchBeanDefinitionFailureAnalyzer,\
org.springframework.boot.autoconfigure.flyway.FlywayMigrationScriptMissingFailureAnalyzer,\
org.springframework.boot.autoconfigure.jdbc.DataSourceBeanCreationFailureAnalyzer,\


# Template availability providers
org.springframework.boot.autoconfigure.template.TemplateAvailabilityProvider=\
org.springframework.boot.autoconfigure.freemarker.FreeMarkerTemplateAvailabilityProvider,\
org.springframework.boot.autoconfigure.mustache.MustacheTemplateAvailabilityProvider,\
org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAvailabilityProvider,\
org.springframework.boot.autoconfigure.thymeleaf.ThymeleafTemplateAvailabilityProvider,\
org.springframework.boot.autoconfigure.web.servlet.JspTemplateAvailabilityProvider

이렇게 많은 자동설정들이 존재한다. 이 프로퍼티에 등록되어있는 클래스들은 모두 @Configuration이 붙어있다.  이 클래스들을 스프링 부트를 시작할 때 다 빈으로 등록되는 것이다. 그런데 위에서 음영으로 색칠한 조건에 따라서 라는 말을 붙였었다. 즉 특정 조건에 맞을 때만 빈을 등록하기도 하고 등록하지 않기도 하는 것이다.

 

그럴때 사용되어지는 애노테이션이 @ConditionalOn..이 접두사로 붙은 애노테이션이다.

@Conditional 애노테이션은 스프링 4.0부터 도입된 애노테이션으로서 조건부로 빈을 스프링 컨테이너에 등록하는 역할을 한다.

 

스프링 web MVC를 자동설정해주는 WebMvcAutoConfiguration 클래스를 잠깐 보자면..

@Configuration(
    proxyBeanMethods = false
)
@ConditionalOnWebApplication(
    type = Type.SERVLET
)
@ConditionalOnClass({Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class})
@ConditionalOnMissingBean({WebMvcConfigurationSupport.class})
@AutoConfigureOrder(-2147483638)
@AutoConfigureAfter({DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class, ValidationAutoConfiguration.class})
public class WebMvcAutoConfiguration {
    public static final String DEFAULT_PREFIX = "";
    public static final String DEFAULT_SUFFIX = "";
    private static final String SERVLET_LOCATION = "/";

    public WebMvcAutoConfiguration() {
    }
    
    ...(생략)
}

@ConditionalOnClass 애노테이션은 특정 클래스 파일이 존재하면 빈으로 등록하라는 애노테이션이고

@ConditionalOnMissingBean 애노테이션은 특정 빈(Bean)이 존재하면 빈을 등록하라는 애노테이션인것이다.

@AutoConfigureOrder 애노테이션은 우선순위를 매기는 애노테이션이다.

 

 

참고

www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8?inst=1e933e3e

 

스프링 부트 개념과 활용 - 인프런

스프링 부트의 원리 및 여러 기능을 코딩을 통해 쉽게 이해하고 보다 적극적으로 사용할 수 있는 방법을 학습합니다. 중급이상 프레임워크 및 라이브러리 Back-End Spring Spring Boot Java 온라인 강의

www.inflearn.com

728x90
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함