포스트

Spring

@SpringBootApplication은 실제로 무엇을 하는가

진입점 애너테이션으로 끝나지 않는다

1
2
3
4
5
6
@SpringBootApplication
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

@SpringBootApplication은 단순히 “부트 앱 시작 표시”가 아니라, 설정 클래스 선언, 자동 설정 활성화, 컴포넌트 스캔 시작점을 한 번에 묶은 복합 애너테이션이다(Spring Boot 레퍼런스).

세 가지 역할을 합친다

  • @SpringBootConfiguration
  • @EnableAutoConfiguration
  • @ComponentScan

이 애너테이션 하나로 “이 클래스는 설정 클래스이고, 여기 패키지를 기준으로 빈을 스캔하고, 클래스패스 상황에 맞는 자동 설정도 켜라”는 의미가 된다.

왜 메인 클래스 위치가 중요한가

@ComponentScan의 기본 기준점이 이 클래스의 패키지이기 때문이다. 메인 클래스가 너무 하위 패키지에 있으면 필요한 빈을 스캔하지 못할 수 있다.

보통 애플리케이션 루트 패키지 최상단에 두는 이유가 여기에 있고, 레퍼런스도 이 배치를 권한다(Structuring Your Code).

자동 설정은 어떻게 동작하는가

자동 설정은 클래스패스에 어떤 라이브러리가 있는지, 어떤 프로퍼티가 설정됐는지, 이미 어떤 빈이 등록됐는지를 보고 조건부로 설정 클래스를 적용하는 방식이다. 이 조건은 @ConditionalOnClass, @ConditionalOnMissingBean 같은 @Conditional 애너테이션으로 표현된다(Creating Your Own Auto-configuration). 조건 평가 과정은 spring-internals-lab 9편에서 따라갔다.

그래서 Spring Boot는 “있으면 알아서 붙여주는” 것이 아니라, 조건이 맞을 때만 설정을 가져온다.

자주 하는 오해

  • @SpringBootApplication만 붙이면 모든 빈이 등록된다고 생각함
  • 자동 설정이 마법처럼 무조건 좋은 방향으로 동작한다고 생각함
  • 필요한 설정까지 자동 설정에 전부 맡겨버림

실제로는 조건이 맞아야 적용되고, 필요하면 exclude하거나 명시 설정으로 덮어야 한다. 직접 등록한 빈이 있으면 해당 자동 설정은 물러난다(Auto-configuration).

정리

이 애너테이션의 내부 구성을 이해하면 “왜 이 빈이 등록됐는지”, “왜 스캔이 안 됐는지”, “왜 자동 설정이 붙었는지”를 훨씬 쉽게 해석할 수 있다.

참고

Spring과 JVM 백엔드
이 글은 저작권자의 CC BY 4.0 라이선스를 따릅니다.

변경이력

2번 수정

  1. docs(notes): cite the spring boot reference for the application annotation
  2. docs(posts): rewrite spring notes collection

댓글

아직 댓글이 없습니다