@SpringBootApplication
2024. 10. 16. 11:18ㆍSpring 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은 세 가지 주요 어노테이션을 결합한 메타 어노테이션입니다:
- @SpringBootConfiguration
- 이 어노테이션은 Spring Boot 애플리케이션의 설정 클래스를 나타냅니다.
- 내부적으로는 Spring의 @Configuration과 동일하게 동작하며, 빈(Bean)을 정의하고 애플리케이션 구성을 제공합니다.
- 즉, 이 클래스가 Spring 컨텍스트의 구성 클래스임을 나타냅니다.
- @EnableAutoConfiguration
- 자동 구성 기능을 활성화합니다.
- Spring Boot는 이 어노테이션을 통해 classpath에 있는 라이브러리나 구성 정보를 기반으로 필요한 설정(예: 데이터베이스 설정, 웹 애플리케이션 설정 등)을 자동으로 구성합니다.
- 이를 통해 개발자는 많은 구성을 수동으로 하지 않고도 필요한 기능을 빠르게 사용할 수 있습니다.
- @ComponentScan
- 해당 패키지와 그 하위 패키지를 스캔하여, @Component, @Service, @Repository, @Controller 등으로 정의된 빈(Bean)들을 자동으로 찾아 Spring 컨텍스트에 등록합니다.
- 일반적으로 @SpringBootApplication이 선언된 클래스가 최상위 패키지에 위치해야 하며, 이 클래스의 패키지와 하위 패키지가 자동으로 스캔됩니다.
@SpringBootApplication의 역할
- Spring Boot 애플리케이션의 진입점:
- @SpringBootApplication이 붙은 클래스는 보통 Spring Boot 애플리케이션의 진입점 역할을 하며, 이 클래스에서 main 메서드를 통해 애플리케이션을 실행합니다.
- Spring Boot 애플리케이션은 이 클래스를 기준으로 설정, 컴포넌트 스캔 및 자동 구성을 시작합니다.
- 자동 구성 제공:
- @EnableAutoConfiguration을 통해 자동 구성을 제공하므로, 많은 설정을 생략해도 Spring Boot가 기본적으로 작동할 수 있습니다.
- 예를 들어, 데이터베이스, 웹 서버, Spring Security 등 여러 라이브러리를 추가할 때 필요한 설정들을 자동으로 처리해 줍니다.
- 빈(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의 장점
- 간결함:
- 여러 개의 어노테이션(@Configuration, @EnableAutoConfiguration, @ComponentScan)을 하나의 어노테이션으로 결합하여 선언함으로써 코드가 간결해집니다.
- 자동 구성:
- Spring Boot가 자동으로 설정을 처리하기 때문에, 개발자는 불필요한 설정에 신경 쓸 필요가 줄어들고 빠르게 애플리케이션을 개발할 수 있습니다.
- 유연성:
- 필요에 따라 자동 구성을 조정하거나 특정 설정을 덮어쓸 수 있어, 다양한 요구 사항을 쉽게 만족시킬 수 있습니다.
@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 |