스프링 프레임워크 핵심 아키텍처: IoC/DI와 AOP 동작 원리

💡 핵심 요약 (Executive Summary)

본 가이드는 fw spring 핵심 가이드 및 실전 아키텍처의 핵심 개념, 실전 구성 명령어 및 아키텍처 베스트 프랙티스를 다룹니다. 클라우드 네이티브 및 인프라 엔지니어링 실무에 즉시 활용 가능하도록 체계적으로 정리했습니다.

📑 Table of Contents
하위 페이지
관련 페이지
Spring 로드순서
  1. 서블릿 컨테이너 초기화: Tomcat, Jetty 등 서블릿 컨테이너가 초기화되고, 서블릿들이 설정됩니다.
  2. DispatcherServlet 등록 및 초기화: 서블릿 컨테이너가 DispatcherServlet을 로드하고 초기화합니다.
  3. Spring 컨테이너(WebApplicationContext) 초기화: DispatcherServlet이 Spring 컨테이너(ApplicationContext)를 초기화하며, 애플리케이션 내의 빈(bean)들을 로드합니다.
  4. 빈(Bean) 생성 및 초기화: Spring 컨테이너가 빈들을 생성하고, 의존성 주입을 통해 빈들을 초기화합니다.
  5. 요청 처리 준비 완료: 서블릿 컨테이너는 HTTP 요청을 받아 처리할 준비가 완료됩니다.
SpringBoot 로드 순서
  1. JVM 시작 및 메인 메서드 실행: @SpringBootApplication이 붙은 메인 클래스의 main() 메서드가 실행됩니다.
java
@SpringBootApplication
   public class MyApplication {
       public static void main(String[] args) {
           SpringApplication.run(MyApplication.class, args);
       }
   }
  1. SpringApplication 객체 생성 및 설정: Spring Boot의 실행 환경과 설정이 결정됩니다.
  2. ApplicationContext 준비: 애플리케이션의 빈 설정과 환경 설정이 준비됩니다.
  3. 자동 설정(Auto-Configuration): 의존성에 따라 자동으로 필요한 설정이 적용됩니다.
    – spring-boot-starter-web 라이브러리가 포함되어 있다면, Spring MVC가 자동으로 설정되고, 내장 톰캣(Tomcat) 서버가 실행됩니다.
    – spring-boot-starter-data-jpa가 포함되어 있으면, Hibernate가 자동으로 설정되고, JPA 리포지토리가 준비됩니다.
  4. 내장 웹 서버 초기화 (Tomcat 등): 웹 애플리케이션인 경우 내장 서블릿 컨테이너가 초기화됩니다.
    – 내장된 서블릿 컨테이너(Tomcat, Jetty, Undertow 등)는 자동으로 설정되고 시작됩니다. 이 과정에서 HTTP 포트, 서블릿 매핑, 필터 등이 설정됩니다.
  5. ApplicationContext 초기화 및 빈 생성: 빈들이 스캔되고 생성되며 의존성 주입이 이루어집니다.
    – @Component, @Service, @Repository, @Controller
    – @Configuration > @Bean (외부 의존성 – Library)
  6. CommandLineRunner, ApplicationRunner 실행: 추가적인 실행 로직이 실행됩니다.
java
@SpringBootApplication
   public class MyApplication implements CommandLineRunner {
       @Override
       public void run(String... args) throws Exception {
           System.out.println("Application started!");
       }
   }
  1. 애플리케이션 실행 완료: 모든 설정이 완료되고 애플리케이션이 실행 상태로 들어갑니다.
  2. 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. 결론
  1. BeanFactory는 Spring Container의 가장 기본적인 형태로, 현재는 주로 내부적으로 사용되거나 간단한 환경에서 활용됩니다.
  2. ApplicationContext는 BeanFactory의 확장판으로, 일반적인 Spring 애플리케이션에서 사용되는 표준 컨테이너입니다.
  3. WebApplicationContext는 ApplicationContext를 확장하여 웹 애플리케이션에 특화된 기능을 제공하며, Spring MVC와 같은 웹 환경에서 사용됩니다.

실무에서는 대부분 ApplicationContext 또는 WebApplicationContext를 사용하며, BeanFactory는 거의 사용되지 않습니다.

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *