2024. 10. 18. 10:45ㆍSpring Boot/Spring Boot Auto Configuration
AnnotationConfigServletWebServerApplicationContext
는 Spring Boot에서 서블릿 기반의 웹 애플리케이션을 실행할 때 사용하는 ApplicationContext
의 한 구현체입니다. 이 클래스는 Java Config 기반 설정을 지원하는 동시에, 서블릿 컨테이너와의 통합을 제공하여, 웹 애플리케이션이 동작하는 데 필요한 컨텍스트를 설정하고 관리합니다.
Spring Boot에서 웹 애플리케이션을 실행할 때, 애플리케이션의 빈(Bean) 관리, 서블릿 컨테이너 설정, 빈 라이프사이클 관리 등을 자동으로 처리하기 위해 이 컨텍스트를 사용합니다.
Spring WebMVC의 Root Application Context 와 Web 전용 Applicaiton Context 계층 구조와는 다르게 Spring Boot 기반 웹 어플리케이션은 단일의 Application Context를 사용합니다. 물론 이원화 가능합니다.
주요 특징
- Java Config 기반 설정 지원:
AnnotationConfigServletWebServerApplicationContext
는 Java 설정을 기반으로 애플리케이션 컨텍스트를 구성하는 기능을 제공합니다. XML 설정 파일 대신@Configuration
클래스와@Bean
어노테이션을 사용하여 빈을 정의할 수 있습니다.- 이는 Spring Boot에서 일반적으로 사용되는 방식으로, 애플리케이션 설정을 Java 코드로 선언적이고 타입 안전하게 관리할 수 있도록 도와줍니다.
- 서블릿 컨테이너 통합:
AnnotationConfigServletWebServerApplicationContext
는 서블릿 컨테이너와의 통합을 지원합니다. 기본적으로 내장된 Tomcat, Jetty, Undertow 등의 서블릿 컨테이너를 사용하여, 별도의 서블릿 컨테이너 설치 없이도 웹 애플리케이션을 실행할 수 있습니다.- 이를 통해 Spring Boot 애플리케이션을 독립적으로 실행할 수 있으며, 개발자는 서블릿 컨테이너의 복잡한 설정을 처리할 필요가 없습니다.
- Web 전용
ApplicationContext
:AnnotationConfigServletWebServerApplicationContext
는WebApplicationContext
인터페이스를 구현합니다. 이는 Spring MVC 애플리케이션에서 요청 및 응답 처리를 위한 웹 관련 빈(컨트롤러, 뷰 리졸버, 필터 등)을 관리하는 데 필수적인 기능을 제공합니다.- 예를 들어,
DispatcherServlet
이 초기화될 때 이 컨텍스트를 통해 컨트롤러와 뷰 리졸버를 참조하여 요청을 처리합니다.
- 빈 등록 및 관리:
- 이 컨텍스트는
DefaultListableBeanFactory
를 상속받아 빈 정의, 빈 등록, 의존성 주입 등의 기능을 제공합니다. 빈 팩토리를 사용해 애플리케이션에서 필요한 다양한 빈을 등록하고 관리하며, 요청 시점에 빈을 생성하여 주입합니다. - 싱글톤, 프로토타입 등 다양한 스코프의 빈을 관리할 수 있으며, 빈의 라이프사이클을 제어합니다.
- 이 컨텍스트는
- 리소스 로딩 및 환경 설정:
ApplicationContext
의 역할 중 하나는 애플리케이션의 리소스를 로드하는 것입니다.AnnotationConfigServletWebServerApplicationContext
는 애플리케이션이 사용하는 외부 리소스(CSS, JS, 이미지 파일 등)를 로드하는 기능을 제공합니다.- 또한, 프로파일이나 설정 파일(
application.properties
,application.yml
)을 로드하여 환경별 구성을 적용할 수 있습니다.
- 애플리케이션 이벤트 및 리스너 처리:
- Spring의 애플리케이션 이벤트 및 리스너를 지원하여, 애플리케이션의 특정 라이프사이클 이벤트에 반응하는 기능을 제공합니다. 예를 들어, 컨텍스트 초기화, 빈 생성, 애플리케이션 종료와 같은 이벤트를 처리할 수 있습니다.
- 내장 서버 구동:
AnnotationConfigServletWebServerApplicationContext
는 내장된 서블릿 컨테이너(Tomcat, Jetty, Undertow)를 관리합니다. 이를 통해 Spring Boot 애플리케이션은 별도의 서버 설정 없이 독립적으로 실행할 수 있습니다. 이 과정에서 서블릿 컨테이너를 자동으로 구동하고, 애플리케이션을 HTTP 포트에 바인딩합니다.
동작 과정
1. 컨텍스트 초기화
Spring Boot 애플리케이션이 실행되면 SpringApplication.run()
메서드가 호출됩니다. 이 메서드는 내부적으로 AnnotationConfigServletWebServerApplicationContext
를 초기화하여 ApplicationContext를 생성합니다. 이때 설정 클래스(@Configuration
이 붙은 클래스)와 @Bean
메서드가 스캔되고 등록됩니다.
AotDetector
AotDetector는 Spring Framework에서 AOT(Ahead-of-Time) 컴파일링과 관련된 기능을 감지하고 처리하는 클래스입니다. 주로 Spring Native나 GraalVM과 같은 환경에서 사용되며, AOT 모드에서 Spring 애플리케이션이 실행되고 있는지 여부를 감지하는 역할을 합니다. AOT 컴파일은 Spring 애플리케이션을 미리 컴파일하여 성능을 최적화하고, 실행 시점의 리플렉션이나 프록시 생성과 같은 동적 처리 과정을 최소화하는 기법입니다.
AotDetector.useGeneratedArtifacts()의 의미
이 메서드는 현재 애플리케이션이 AOT 컴파일 모드에서 실행 중인지 여부를 반환합니다. 만약 AOT 모드라면, 미리 생성된 아티팩트(예: 컴파일된 빈 정의, 리소스 파일 등)를 사용하여 애플리케이션을 실행하는 데 필요한 작업을 최적화합니다.
2. 내장 서버 설정
이후 내장 서블릿 컨테이너(Tomcat, Jetty, Undertow 등)가 설정됩니다. ServletWebServerFactory
빈을 통해 적절한 서버 설정이 이루어지며, HTTP 요청을 처리할 준비를 갖추게 됩니다. 이 과정에서 애플리케이션은 서블릿, 필터, 리스너 등을 자동으로 등록합니다.
3. 빈 생성 및 주입
컨텍스트가 초기화되면, 필요한 빈들이 ApplicationContext
에 등록되고, @Autowired
나 @Inject
와 같은 어노테이션을 통해 의존성이 자동으로 주입됩니다. 이때 싱글톤 빈은 컨텍스트 초기화 시점에 한 번 생성되고, 프로토타입 빈은 요청될 때마다 새로 생성됩니다.
4. 웹 요청 처리
DispatcherServlet
이 HTTP 요청을 받아 컨트롤러를 통해 요청을 처리합니다. AnnotationConfigServletWebServerApplicationContext
는 웹 전용 컨텍스트이므로, 요청을 처리하는 데 필요한 컨트롤러, 뷰 리졸버 등의 빈을 관리하고, 각 요청을 적절한 컨트롤러로 전달하여 응답을 생성합니다.
5. 컨텍스트 종료
애플리케이션이 종료될 때, ApplicationContext
는 빈의 라이프사이클을 종료합니다. 빈이 더 이상 사용되지 않으면 메모리에서 해제되며, 이 과정에서 @PreDestroy
와 같은 애너테이션을 통해 빈의 종료 작업이 수행됩니다.
사용 예시
1. 기본적인 Spring Boot 웹 애플리케이션
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
위 코드는 Spring Boot 웹 애플리케이션의 기본 형태입니다. SpringApplication.run()
메서드는 내부적으로 AnnotationConfigServletWebServerApplicationContext
를 생성하여 애플리케이션을 실행하고, 내장 서버(Tomcat, Jetty, Undertow)를 구동시킵니다.
2. 커스텀 빈 정의
@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyService(); // 애플리케이션에서 사용할 서비스 빈 등록
}
}
위 코드는 @Configuration
클래스에서 @Bean
메서드를 사용해 빈을 등록하는 Java Config 기반 설정의 예시입니다. AnnotationConfigServletWebServerApplicationContext
는 이 빈을 컨텍스트에 등록하고, 애플리케이션에서 필요할 때 해당 빈을 제공합니다.
내부 구성
AnnotationConfigServletWebServerApplicationContext
는 여러 클래스와 인터페이스를 상속받아 기능을 확장합니다.
GenericWebApplicationContext
: 이 클래스는WebApplicationContext
를 기본으로 하며, 서블릿과 관련된 설정을 처리합니다.AnnotationConfigServletWebServerApplicationContext
는 이를 상속받아 웹 애플리케이션의 구성을 담당합니다.AnnotationConfigApplicationContext
: 이 클래스는 Java Config를 기반으로 빈을 등록하는 기능을 제공하는 핵심 클래스입니다.@Configuration
클래스와@Bean
메서드를 통해 애플리케이션 설정을 관리합니다.DefaultListableBeanFactory
: 이 클래스는 빈 팩토리의 기본 구현체로, 빈 정의 관리, 의존성 주입, 빈의 스코프 처리 등을 담당합니다.AnnotationConfigServletWebServerApplicationContext
는 이 기능을 상속받아 빈을 관리합니다.
장점
- 내장 서버와의 통합: Spring Boot의 내장 서버와 쉽게 통합할 수 있어, 별도의 웹 서버 설치나 설정 없이도 애플리케이션을 실행할 수 있습니다.
- Java Config 지원: Java Config 기반으로 빈을 설정하므로, XML 설정 파일 없이도 모든 설정을 Java 코드로 처리할 수 있어 유지보수가 쉽습니다.
- 서블릿 컨테이너 자동 관리: 서블릿 컨테이너의 초기화, 구동, 종료 등을 Spring Boot가 자동으로 처리하여 복잡한 설정을 할 필요가 없습니다.
- 확장성과 유연성:
WebApplicationContext
와 같은 웹 전용 설정을 지원하면서도, 전통적인 Spring의 기능을 모두 제공하여 확장 가능하고 유연한 애플리케이션 구성이 가능합니다.
결론
AnnotationConfigServletWebServerApplicationContext
는 Spring Boot에서 서블릿 기반 웹 애플리케이션을 위한 핵심 컨텍스트 구현체로, Java Config 기반의 설정과 내장 서블릿 컨테이너와의 통합을 통해 빠르고 쉽게 애플리케이션을 개발할 수 있게 합니다. 이 클래스는 빈 관리, 서블릿 컨테이너 관리, 웹 요청 처리 등 웹 애플리케이션의 전반적인 구성을 자동으로 처리하여 개발자가 최소한의 설정으로 애플리케이션을 실행할 수 있도록 돕습니다.
'Spring Boot > Spring Boot Auto Configuration' 카테고리의 다른 글
ConfigurationClassParser (0) | 2024.10.18 |
---|---|
PostProcessorRegistrationDelegate (0) | 2024.10.18 |
AutoConfigurationImportSelector (0) | 2024.10.18 |
DeferredImportSelector (0) | 2024.10.17 |
spring-boot-autoconfigure.jar (0) | 2024.10.16 |