BE/Spring & Spring Boot

[Spring Boot] ApplicationContext

baek-dev 2025. 3. 23. 13:52

ApplicationContext란?

 

ApplicationContext는 스프링(Spring)의 핵심 인터페이스로, 스프링이 관리하는 Bean들의 생성, 관리, 설정 등을 담당하는 IoC 컨테이너임.

 

IoC(Inversion of Control, 제어의 역전)란 객체의 생성과 관리를 프로그래머가 아니라 외부 컨테이너(스프링 컨테이너)에 맡기는 것을 의미하는데, 스프링에서 이 역할을 하는 컨테이너가 바로 ApplicationContext임.

 

즉, 스프링에서 사용되는 거의 모든 객체(Bean)는 ApplicationContext에 의해 관리된다고 보면 됨.

 


ApplicationContext의 핵심 역할

 

ApplicationContext의 핵심적인 기능들은 다음과 같음.

Bean 생성 및 관리

의존성 주입(DI, Dependency Injection) 처리

Bean의 생명주기(Lifecycle) 관리

리소스(Resource) 로딩 및 관리

이벤트(Event) 발행 및 처리

국제화(i18n) 지원

환경설정(Property) 관리

 

정리하면, 스프링 애플리케이션이 동작하는 데 필요한 대부분의 관리를 ApplicationContext가 수행함.

 


ApplicationContext의 주요 구현체

 

ApplicationContext는 인터페이스이고, 스프링은 여러 구현체를 제공함. 자주 사용하는 구현체는 다음과 같음.

ClassPathXmlApplicationContext

    • XML 기반의 설정파일을 클래스패스에서 로딩할 때 사용함.

FileSystemXmlApplicationContext

    • XML 설정파일을 파일 시스템의 특정 경로에서 읽을 때 사용함.

AnnotationConfigApplicationContext (자주 사용)

    • Java 설정(@Configuration 어노테이션)을 기반으로 Bean을 등록할 때 사용함.

GenericWebApplicationContext / AnnotationConfigWebApplicationContext (웹 기반)

    • 웹 환경(Spring MVC 등)에서 Bean을 관리할 때 사용함.

 

최근 Spring Boot를 주로 사용하기 때문에 대부분은 AnnotationConfigApplicationContext 또는 AnnotationConfigWebApplicationContext를 활용하게 됨.

 


ApplicationContext의 사용법 (예제)

 

스프링에서 Annotation 기반으로 ApplicationContext를 생성하고 Bean을 사용하는 예제는 다음과 같음.

 

간단한 Bean 정의하기

@Component
public class UserService {
    public void hello() {
        System.out.println("Hello, Spring!");
    }
}

 

ApplicationContext를 이용한 Bean 관리 예시

@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {
}
public class ApplicationContextExample {
    public static void main(String[] args) {
        ApplicationContext context = 
            new AnnotationConfigApplicationContext(AppConfig.class);

        UserService userService = context.getBean(UserService.class);
        userService.hello();
    }
}

 

실행 결과

Hello, Spring!

 

위의 코드를 분석하면:

@Component가 붙은 클래스는 스프링이 관리하는 Bean으로 등록됨.

@ComponentScan을 통해 특정 패키지(com.example) 하위의 Bean을 스캔하여 등록함.

ApplicationContext를 통해 Bean을 가져오고 사용함.

 


ApplicationContext의 Bean 관리 메서드 정리

 

자주 사용되는 ApplicationContext의 메서드들은 다음과 같음.

메서드 용도
getBean(Class) 타입을 기준으로 Bean을 조회
getBean(String) Bean 이름(ID)을 기준으로 Bean을 조회
getBean(String, Class) 이름과 타입을 기준으로 Bean을 조회
containsBean(String) 특정 Bean이 등록되어 있는지 확인
getBeanDefinitionNames() 등록된 모든 Bean 이름 조회
getEnvironment() 환경설정(properties 등) 접근

 

 


Bean의 생명주기(Lifecycle) 관리

 

ApplicationContext는 Bean의 전체적인 생명주기도 관리함. 크게 다음과 같은 순서로 이루어짐:

1. Bean 객체 생성 (객체 인스턴스 생성)

2. 의존성 주입(Dependency Injection) (필요한 의존성 연결)

3. 초기화(Initialization) (afterPropertiesSet 또는 @PostConstruct 호출)

4. 사용(Bean Usage) (애플리케이션 로직 수행)

5. 소멸(Destroy) (DisposableBean 또는 @PreDestroy 호출)

 

이러한 Bean의 생명주기를 모두 ApplicationContext가 관리함으로써 개발자는 객체 생성 및 관리 코드 없이 비즈니스 로직에 집중할 수 있게 됨.

 


ApplicationContext와 BeanFactory의 차이

 

ApplicationContext 이전의 기본 컨테이너는 BeanFactory임.

ApplicationContext는 BeanFactory의 모든 기능을 포함하며 더 다양한 추가 기능(이벤트, 메시지 리소스, 국제화 등)을 제공함.

기능 BeanFactory ApplicationContext
Bean 생성 및 관리 O O
의존성 주입 O O
라이프사이클 콜백 제한적 완전 지원
국제화(i18n) X O
이벤트 및 메시지 처리 X O
자동 Bean 등록 및 컴포넌트 스캔 제한적 완전 지원

일반적으로 현재는 BeanFactory 대신 ApplicationContext를 사용하는 것이 표준임.

 


정리하면:

ApplicationContext는 스프링의 핵심 인터페이스이며, 스프링이 관리하는 Bean들을 생성, 관리, 의존성 주입 등을 담당하는 컨테이너임.

Bean의 생명주기 관리, 이벤트 처리, 국제화, 환경설정 관리 등의 다양한 기능을 제공함.

최근 스프링 애플리케이션 개발에서는 주로 AnnotationConfigApplicationContext를 많이 사용함.

 

 

 

 

출처 : ChatGPT

'BE > Spring & Spring Boot' 카테고리의 다른 글

[Spring Boot] DAO와 Repository의 차이?  (1) 2025.03.31
[Spring Boot] DAO  (0) 2025.03.30
[Spring Boot] 스프링의 생성자 주입  (0) 2025.03.19
[Spring Boot] Spring AI  (0) 2025.03.13
[Spring Boot] DispatcherServlet  (0) 2025.03.07