HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
[New] 타일러팀
[New] 타일러팀
/
🙆‍♂️
@SpringBootApplication
🙆‍♂️

@SpringBootApplication

Category
Spring
Created
Apr 24, 2022 10:27 AM
Person
State
완료

@SpringBootApplication

  • org.springframework.boot.autoconfigure 패키지 안에 들어있다.
@SpringBootApplication public class Application{ public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
 
@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

💡
현재 클래스가 Spring의 설정 파일임을 알려주는 어노테이션
  • Configuration을 클래스에 적용하고 @Bean을 해당 클래스의 메소드에 적용하면 빈으로 등록된다.
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Configuration @Indexed public @interface SpringBootConfiguration { @AliasFor( annotation = Configuration.class ) boolean proxyBeanMethods() default true; }

@ComponentScan

💡
  • @Component @Configuration @Repository @Service @Controller @RestController
  • 해당 어노테이션이 선언된 하위 패키지에서 위와 같은 Annotation을 찾아서 Bean으로 등록한다.

@EnableAutoConfiguration

💡
어플리케이션에 추가된 설정들을 자동으로 추가해주는 어노테이션
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @AutoConfigurationPackage @Import({AutoConfigurationImportSelector.class}) public @interface EnableAutoConfiguration { StringENABLED_OVERRIDE_PROPERTY= "spring.boot.enableautoconfiguration"; Class<?>[] exclude() default {}; String[] excludeName() default {}; }
  • 스프링 부트의 Application Context 설정을 자동으로 수행한다는 어노테이션으로, META-INF/spring.factories에 정의되어 있는 configuration 대상 클래스들을 빈으로 등록한다.
  • 위 파일에 정리된 클래스들은 @Configuration 어노테이션이 없어도 자동으로 빈이 등록
  • 추가로 개발자가 직접 이 spring.factories에 클래스를 적어 넣으면 Auto Configuration 대상에 포함된다.

Auto Configuration Mechanism

  • 이렇게 많은 클래스들이 항상 다 빈으로 등록되면 엄청난 리소스 낭비가 된다.
  • AutoConfigurationImportSelector 클래스를 통해서 필터링 작업을 수행
 
AutoConfigurationImportSelector 의 Auto Configuration 필터링 과정 https://velog.io/@jwkim/spring-boot-springapplication-annotation
 
 

스프링 빈 등록 방식

1. 컴포넌트 스캔 대상

  • @Component @Configuration @Repository @Service @Controller @RestController

2. Java 코드로 등록

@Configuration public class AppConfig { @Bean public MemberRepository memberRepository() { return new MemoryMemberRepository(); } @Bean public MemberService memberService() { return new MemberServiceImpl(memberRepository()); } }
  • @Configuration 스프링 설정 정보로 인식하고 스프링 빈이 싱글톤을 유지하도록 추가 처리를 한다.
  • 빈으로 등록하기 위해 인스턴슬르 생성하는 메소드 위에 @Bean을 명시한다.

@Bean vs @Component

  • @Bean
    • 개발자가 컨트롤이 불가능한 외부 라이브러리들을 Bean으로 등록하고 싶은 경우 사용된다.
    • 메소드 또는 어노테이션 단위로 붙일 수 있다.
  • @Component
    • 개발자가 직접 컨트롤이 가능한 클래스들의 경우에 사용된다.
    • 클래스 또는 인터페이스 단위에 붙일 수 있다.