Spring Boot Core Execution(스프링 부트 핵심과 실행 과정)
과거 스프링 프레임워크는 직접 설정을 해야하고 구성하는 등의 번거로움이 상당히 많았지만 스프링 부트가 등장하면서 손쉽게 웹 애플리케이션을 만들 수 있게 되었다.
라이브러리 버전 관리 자동화
여러 라이브러리의 버전을 명시하지 않더라도 적합한 버전을 자동으로 관리
자동 설정 자동화
다양한 공통적인 설정을 자동으로 구성
내장 웹 서버 제공
톰캣과 같은 별도 웹 서버를 설치하지 않아도 내장 웹 서버를 통해 웹 애플리케이션을 실행할 수 있도록 지원
실행 가능한 JAR
순수 자바 애플리케이션 프로그램을 실행하는 것처럼 실행에 대한 편리성 제공
이처럼 스프링 부트는 스프링 프레임워크의 설정과 기능을 단순화하고 자동화하여 개발자가 더 쉽게 스프링 기반 애플리케이션을 개발할 수 있도록 도와준다.
@SpringBootApplication
Spring Initializr를 통해 프로젝트를 생성하면 아래와 같이 @SpringBootApplication
어노테이션이 선언된 클래스가 생성된다.
@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
@Configuration의 메타 애노테이션
스프링 부트의 애플리케이션 설정 클래스임을 나타냄
@EnableAutoConfiguration
자동 설정 활성화
@Import를 통해
META-INF/.../...imports
파일의 자동 설정 클래스를 읽어 등록
@ComponentScan
현재 패키지와 하위 패키지를 스캔하여 컴포넌트를 빈으로 등록
제외/포함 필터로 세밀 제어 가능
SpringBootApplication 클래스
Main 코드에서 SpringApplication.run(Application.class, args);
를 통해 run
메서드를 호출하는데, 아래의 역할을 수행하게 된다.
스프링 애플리케이션을 초기화하고 실행하는 주요한 역할을 수행
실행 리스너들에게 이벤트 발생
자동 구성을 수행하고 환경 설정 준비
애플리케이션 컨텍스트 생성 및 초기화
ApplicationRunner와 CommandLineRunner 실행
스프링 부트의 실행 과정
위 내용을 바탕으로 스프링 부트의 실행 과정을 정리하면 아래와 같다.
@SpringBootApplication이 선언된 메인 클래스에서 main 실행
SpringApplication.run 호출로 환경(Environment) 준비, 프로파일 적용
ApplicationContext 생성 및 초기화, ApplicationContextInitializer 적용
@ComponentScan으로 애플리케이션 컴포넌트 등록
@EnableAutoConfiguration에 의해 자동 설정 클래스 로딩 및 조건 평가
컨텍스트 refresh, 빈 후처리기와 라이프사이클 콜백 실행
웹 애플리케이션이면 내장 웹 서버(Tomcat/Jetty/Undertow) 시작
ApplicationRunner, CommandLineRunner 실행
애플리케이션 준비 완료, 요청 처리 가능 상태
참고자료
Last updated
Was this helpful?