프레임워크/스프링&스프링부트

@SpringBootApplication 이해하기

@SpringBootApplication 이해하기

spring boot 프로젝트를 생성하고 나서 메인 메소드를 확인하면 다음과 같은 코드를 확인할 수 있다.

package com.example.xxx;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

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

@SpringBootApplication으로 인해  자동 설정 및 Bean 읽기와 생성을 모두 자동을 설정 됩니다.

그리고 여기서 주의할 점으로는 해당 설정이 @SpringBootApplication이 있는 위치부터 설정을 읽어가기 때문에 해당 프로젝트의 최상단에 위치시켜 실행 시켜야합니다.

 

그렇다면 어떻게 @SpringBootApplication 위와 같은 작업이 실행될 수 있는지 알아보기 위해 구조를 확인할 필요가 있습니다.

@SpringBootApplication 구조

@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 {
	@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;
}

여기서 중요하게 확인할수 있는 어노테이션들이 있는데 @SpringBootConfiguration@EnableAutoConfiguration 그리고 @ComponentScan 을 확인 할 수있다. 

 

즉, @SpringBootAnnotation은 저 3개의 어노테이션이 하는 역할을 한번에 처리해주기 위해 묶어둔 어노테이션인 것이다. 또한, Bean을 등록해주기 위해 내부적으로 2단계를 거치게 되는데 다음과 같습니다.

  1. ComponentScan : 하위 패키지을 스캔하여 @Component, @Service, @Controller 등의 어노테이션을 찾아 Bean으로 등록.
  2. EnableAutoConfiguration : 기타 라이브러리 클래스들을 자동으로 찾아 Bean으로 등록.

즉, ComponentScan의 경우 개발자가 직접 해당 등록한 어노테이션을 찾아서 빈으로 등록해주는 것이고 EnableAutoConfiguration의 경우 관련되서 추가된 기타 라이브러리 클래스들을 자동으로 찾아서 Bean으로 등록해주는 것이다.

 

해당 어노테이션에 대한 자세한 내용은 따로 다루도록 하겠다.

 

이렇든 @SpringBootApplication 어노테이션 하나로 Spring Boot Application을 실행할 수 있도록 도와주게된다.