@SpringBootApplication

2024. 10. 16. 11:18Spring Boot/Spring Boot Auto Configuration

 

@SpringBootApplication은 Spring Boot 애플리케이션에서 가장 중요한 어노테이션 중 하나로, 애플리케이션을 실행하는 데 필요한 여러 설정을 한 번에 처리할 수 있도록 해주는 메타 어노테이션입니다. 이 어노테이션은 여러 다른 어노테이션을 포함하고 있으며, Spring Boot 애플리케이션을 쉽게 설정하고 실행할 수 있게 해줍니다.

package org.springframework.boot.autoconfigure;

// ...

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

@SpringBootApplication의 구성 요소

@SpringBootApplication은 세 가지 주요 어노테이션을 결합한 메타 어노테이션입니다:

  1. @SpringBootConfiguration
    • 이 어노테이션은 Spring Boot 애플리케이션의 설정 클래스를 나타냅니다.
    • 내부적으로는 Spring의 @Configuration과 동일하게 동작하며, 빈(Bean)을 정의하고 애플리케이션 구성을 제공합니다.
    • 즉, 이 클래스가 Spring 컨텍스트의 구성 클래스임을 나타냅니다.
  2. @EnableAutoConfiguration
    • 자동 구성 기능을 활성화합니다.
    • Spring Boot는 이 어노테이션을 통해 classpath에 있는 라이브러리나 구성 정보를 기반으로 필요한 설정(예: 데이터베이스 설정, 웹 애플리케이션 설정 등)을 자동으로 구성합니다.
    • 이를 통해 개발자는 많은 구성을 수동으로 하지 않고도 필요한 기능을 빠르게 사용할 수 있습니다.
  3. @ComponentScan
    • 해당 패키지와 그 하위 패키지를 스캔하여, @Component, @Service, @Repository, @Controller 등으로 정의된 빈(Bean)들을 자동으로 찾아 Spring 컨텍스트에 등록합니다.
    • 일반적으로 @SpringBootApplication이 선언된 클래스가 최상위 패키지에 위치해야 하며, 이 클래스의 패키지와 하위 패키지가 자동으로 스캔됩니다.

@SpringBootApplication의 역할

  1. Spring Boot 애플리케이션의 진입점:
    • @SpringBootApplication이 붙은 클래스는 보통 Spring Boot 애플리케이션의 진입점 역할을 하며, 이 클래스에서 main 메서드를 통해 애플리케이션을 실행합니다.
    • Spring Boot 애플리케이션은 이 클래스를 기준으로 설정, 컴포넌트 스캔 및 자동 구성을 시작합니다.
  2. 자동 구성 제공:
    • @EnableAutoConfiguration을 통해 자동 구성을 제공하므로, 많은 설정을 생략해도 Spring Boot가 기본적으로 작동할 수 있습니다.
    • 예를 들어, 데이터베이스, 웹 서버, Spring Security 등 여러 라이브러리를 추가할 때 필요한 설정들을 자동으로 처리해 줍니다.
  3. 빈(Component) 자동 스캔:
    • @ComponentScan을 통해 해당 패키지와 그 하위 패키지에서 빈을 스캔하여 자동으로 등록합니다. 이를 통해 개발자는 별도의 XML 설정 파일이나 명시적인 빈 등록 없이 빈을 사용할 수 있습니다.

사용 예시

@SpringBootApplication
public class MySpringBootApplication {

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

 

위의 코드는 Spring Boot 애플리케이션의 전형적인 진입점 코드입니다. @SpringBootApplication 어노테이션이 선언된 클래스에서 main 메서드를 실행함으로써 애플리케이션을 구동합니다.

@SpringBootApplication 어노테이션의 옵션

@SpringBootApplication은 다양한 속성을 제공하여 자동 구성이나 컴포넌트 스캔의 동작 방식을 커스터마이징할 수 있습니다:

  • exclude와 excludeName: 자동 구성에서 특정 클래스를 제외할 수 있습니다.
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class MyApplication {
}
  • scanBasePackages와 scanBasePackageClasses: 특정 패키지나 클래스에 대해 컴포넌트 스캔을 수행하도록 지정할 수 있습니다.
@SpringBootApplication(scanBasePackages = {"com.example.service", "com.example.repository"})
public class MyApplication {
}

@SpringBootApplication의 장점

  1. 간결함:
    • 여러 개의 어노테이션(@Configuration, @EnableAutoConfiguration, @ComponentScan)을 하나의 어노테이션으로 결합하여 선언함으로써 코드가 간결해집니다.
  2. 자동 구성:
    • Spring Boot가 자동으로 설정을 처리하기 때문에, 개발자는 불필요한 설정에 신경 쓸 필요가 줄어들고 빠르게 애플리케이션을 개발할 수 있습니다.
  3. 유연성:
    • 필요에 따라 자동 구성을 조정하거나 특정 설정을 덮어쓸 수 있어, 다양한 요구 사항을 쉽게 만족시킬 수 있습니다.

@SpringBootApplication은 Spring Boot 애플리케이션의 시작점을 정의하고, 애플리케이션을 설정하는데 필요한 주요 기능들을 하나의 어노테이션으로 묶어 간편하게 사용할 수 있게 해줍니다. 이를 통해 개발자는 빠르게 Spring 애플리케이션을 설정하고 구동할 수 있으며, 복잡한 설정 없이도 애플리케이션 개발을 쉽게 시작할 수 있습니다.

 
 

'Spring Boot > Spring Boot Auto Configuration' 카테고리의 다른 글

@EnableAutoConfiguration  (0) 2024.10.16
@SpringBootConfiguration  (0) 2024.10.16
SpringApplication.run  (0) 2024.10.16
Classpath  (0) 2024.10.16
@Import  (0) 2023.05.04