💡 핵심 요약 (Executive Summary)
본 가이드는 fw spring 핵심 가이드 및 실전 아키텍처의 핵심 개념, 실전 구성 명령어 및 아키텍처 베스트 프랙티스를 다룹니다. 클라우드 네이티브 및 인프라 엔지니어링 실무에 즉시 활용 가능하도록 체계적으로 정리했습니다.
📑 Table of Contents
하위 페이지
관련 페이지
Spring 로드순서
- 서블릿 컨테이너 초기화: Tomcat, Jetty 등 서블릿 컨테이너가 초기화되고, 서블릿들이 설정됩니다.
- DispatcherServlet 등록 및 초기화: 서블릿 컨테이너가 DispatcherServlet을 로드하고 초기화합니다.
- Spring 컨테이너(WebApplicationContext) 초기화: DispatcherServlet이 Spring 컨테이너(ApplicationContext)를 초기화하며, 애플리케이션 내의 빈(bean)들을 로드합니다.
- 빈(Bean) 생성 및 초기화: Spring 컨테이너가 빈들을 생성하고, 의존성 주입을 통해 빈들을 초기화합니다.
- 요청 처리 준비 완료: 서블릿 컨테이너는 HTTP 요청을 받아 처리할 준비가 완료됩니다.
SpringBoot 로드 순서
- JVM 시작 및 메인 메서드 실행: @SpringBootApplication이 붙은 메인 클래스의 main() 메서드가 실행됩니다.
java
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
- SpringApplication 객체 생성 및 설정: Spring Boot의 실행 환경과 설정이 결정됩니다.
- ApplicationContext 준비: 애플리케이션의 빈 설정과 환경 설정이 준비됩니다.
- 자동 설정(Auto-Configuration): 의존성에 따라 자동으로 필요한 설정이 적용됩니다.
– spring-boot-starter-web 라이브러리가 포함되어 있다면, Spring MVC가 자동으로 설정되고, 내장 톰캣(Tomcat) 서버가 실행됩니다.
– spring-boot-starter-data-jpa가 포함되어 있으면, Hibernate가 자동으로 설정되고, JPA 리포지토리가 준비됩니다. - 내장 웹 서버 초기화 (Tomcat 등): 웹 애플리케이션인 경우 내장 서블릿 컨테이너가 초기화됩니다.
– 내장된 서블릿 컨테이너(Tomcat, Jetty, Undertow 등)는 자동으로 설정되고 시작됩니다. 이 과정에서 HTTP 포트, 서블릿 매핑, 필터 등이 설정됩니다. - ApplicationContext 초기화 및 빈 생성: 빈들이 스캔되고 생성되며 의존성 주입이 이루어집니다.
– @Component, @Service, @Repository, @Controller
– @Configuration > @Bean (외부 의존성 – Library) - CommandLineRunner, ApplicationRunner 실행: 추가적인 실행 로직이 실행됩니다.
java
@SpringBootApplication
public class MyApplication implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
System.out.println("Application started!");
}
}
- 애플리케이션 실행 완료: 모든 설정이 완료되고 애플리케이션이 실행 상태로 들어갑니다.
- HTTP 요청 처리: 클라이언트의 요청이 들어오면 DispatcherServlet을 통해 처리됩니다.
Spring Container
구현체
Reference & Guidelines (NOTE)
BeanFactory, ApplicationContext, WebApplicationContext는 Spring Framework에서 제공하는 주요 컨테이너 구현체들로, 각각의 특징과 역할이 다릅니다. 아래는 이들의 차이점과 비교를 정리한 내용입니다.
1. BeanFactory
- 설명
- Spring Framework의 가장 기본적인 컨테이너로, **DI(Dependency Injection)**와 Bean 생명주기 관리를 제공합니다.
- Lazy Initialization(지연 초기화)을 기본으로 하며, 필요한 시점에 Bean을 생성합니다.
- 최소한의 기능만 제공하므로, 메모리 효율적이지만 추가 기능이 부족합니다.
- 주요 특징
- 지연 초기화: Bean을 요청하기 전까지 생성하지 않습니다.
- 경량 컨테이너: 애플리케이션의 기초적인 DI 및 Bean 관리를 위한 컨테이너.
- 추가 기능 없음: 이벤트 처리, 메시지 소스, 국제화 같은 고급 기능을 제공하지 않음.
- 사용 예
java
java
코드 복사
Resource resource = new ClassPathResource("beans.xml");
BeanFactory factory = new XmlBeanFactory(resource); // Deprecated
MyBean bean = factory.getBean(MyBean.class);
2. ApplicationContext
- 설명
- BeanFactory를 확장한 컨테이너로, 고급 기능과 애플리케이션 전반의 설정을 지원합니다.
- BeanFactory의 모든 기능을 포함하며, 이벤트 처리, 메시지 소스, 국제화, AOP 등의 추가 기능을 제공합니다.
- Spring 애플리케이션에서 기본적으로 사용하는 컨테이너입니다.
- 주요 특징
- 즉시 초기화: 애플리케이션 시작 시 모든 Singleton Bean을 초기화합니다(지연 초기화 가능).
- 고급 기능 제공:
- 이벤트 처리(
ApplicationEvent). - 국제화 지원(
MessageSource). - AOP와 통합.
- 이벤트 처리(
- 종류:
ClassPathXmlApplicationContext: 클래스 경로의 XML 파일을 읽음.FileSystemXmlApplicationContext: 파일 시스템 경로의 XML 파일을 읽음.AnnotationConfigApplicationContext: Java Config를 사용.
- 사용 예
java
java
코드 복사
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
MyBean bean = context.getBean(MyBean.class);
3. WebApplicationContext
- 설명
- ApplicationContext의 서브 인터페이스로, 웹 애플리케이션에 특화된 기능을 추가로 제공합니다.
- Spring MVC와 같은 웹 애플리케이션에서 사용되며, ServletContext와 통합됩니다.
- Spring의 DispatcherServlet이 WebApplicationContext를 초기화하고 관리합니다.
- 주요 특징
- 웹 환경 통합: ServletContext와 통합되어 웹 애플리케이션 전용 기능을 지원.
- Root Context와 Servlet Context 분리 가능:
- Root Context: 공통적으로 사용하는 Bean(예: 데이터베이스 연결).
- Servlet Context: 특정 서블릿에 필요한 Bean(예: 컨트롤러).
- 추가 기능:
- 서블릿과 통합된 Bean 관리.
- 웹 애플리케이션 스코프 지원(
request,session,application스코프).
- 구현체:
XmlWebApplicationContext: XML 설정 기반.AnnotationConfigWebApplicationContext: Java Config 기반.
- 사용 예
DispatcherServlet에 의해 초기화:
xml
xml
코드 복사
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
ServletContext에서 WebApplicationContext 참조:
java
java
코드 복사
ServletContext servletContext = request.getServletContext();
WebApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(servletContext);
MyBean bean = context.getBean(MyBean.class);
4. 주요 차이점 비교
| 특징 | BeanFactory | ApplicationContext | WebApplicationContext |
| 목적 | 기본적인 DI와 Bean 생명주기 관리 | 애플리케이션 전반의 설정과 고급 기능 지원 | 웹 애플리케이션 특화 기능 제공 |
| 초기화 시점 | Lazy Initialization | 애플리케이션 시작 시 초기화 | 웹 애플리케이션 시작 시 DispatcherServlet에 의해 초기화 |
| 추가 기능 | 없음 | 이벤트 처리, 국제화, AOP 지원 | ServletContext와 통합, 웹 스코프 지원 |
| 주요 구현체 | XmlBeanFactory | ClassPathXmlApplicationContext, AnnotationConfigApplicationContext | XmlWebApplicationContext, AnnotationConfigWebApplicationContext |
| 사용 환경 | 간단한 애플리케이션 | 일반적인 Spring 애플리케이션 | Spring MVC, 웹 애플리케이션 |
| ServletContext와의 통합 | 없음 | 없음 | 통합되어 동작 |
5. 선택 기준
- BeanFactory:
- 단순한 애플리케이션이나 테스트 코드에서 Bean 관리가 필요할 때 사용(현재는 거의 사용되지 않음).
- ApplicationContext:
- 일반적인 Spring 애플리케이션에서 기본적으로 사용하는 컨테이너.
- WebApplicationContext:
- 웹 애플리케이션(Spring MVC)에서 필요한 기능(ServletContext 통합, 웹 스코프 등)을 제공할 때 사용.
6. 결론
- BeanFactory는 Spring Container의 가장 기본적인 형태로, 현재는 주로 내부적으로 사용되거나 간단한 환경에서 활용됩니다.
- ApplicationContext는 BeanFactory의 확장판으로, 일반적인 Spring 애플리케이션에서 사용되는 표준 컨테이너입니다.
- WebApplicationContext는 ApplicationContext를 확장하여 웹 애플리케이션에 특화된 기능을 제공하며, Spring MVC와 같은 웹 환경에서 사용됩니다.
실무에서는 대부분 ApplicationContext 또는 WebApplicationContext를 사용하며, BeanFactory는 거의 사용되지 않습니다.
Leave a Reply