Spring

Spring의 ApplicationContext: IoC 컨테이너와 빈 관리

초코너무조코 2025. 3. 23. 20:03
728x90

Spring Framework의 핵심 개념 중 하나는 IoC (Inversion of Control) 입니다. IoC는 객체의 생성과 의존성 관리를 Spring 컨테이너가 담당하는 원칙으로, 개발자는 객체 간의 의존성을 직접 관리하는 대신 Spring이 이를 관리하게 됩니다. 이때, Spring에서 중요한 역할을 하는 것이 바로 ApplicationContext 입니다.

ApplicationContext는 Spring의 IoC 컨테이너로, 애플리케이션에서 사용되는 객체들(빈)을 관리하고, 객체 간의 의존성을 주입하며, 애플리케이션의 설정 정보를 로드하는 역할을 합니다. ApplicationContext를 통해 Spring은 객체들을 생성하고 관리하며, 의존성 주입(Dependency Injection)을 통해 객체 간의 관계를 설정합니다.

이번 글에서는 ApplicationContext의 역할과 사용법에 대해 깊이 살펴보겠습니다.


1. ApplicationContext란?

ApplicationContext는 Spring에서 가장 중요한 컴포넌트 중 하나로, IoC 컨테이너의 구현체입니다. ApplicationContext는 애플리케이션의 구성 요소인 빈(Bean) 을 관리하고, 빈 간의 의존성을 해결하며, 애플리케이션의 라이프사이클을 관리합니다.

ApplicationContext의 주요 기능은 다음과 같습니다:

  1. 빈 관리: 애플리케이션에서 사용되는 객체들을 관리합니다. 객체 생성, 초기화, 의존성 주입 등을 처리합니다.
  2. 스프링의 설정 정보 로딩: XML 설정 파일 또는 애노테이션을 기반으로 설정된 정보를 읽어들이고, 이에 맞춰 빈을 생성합니다.
  3. 이벤트 처리: Spring의 이벤트를 처리하고, 애플리케이션의 상태 변화를 추적합니다.
  4. 환경 관리: 애플리케이션의 환경 정보를 제공하며, 프로퍼티 파일 등을 관리할 수 있습니다.

2. ApplicationContext의 주요 구현체들

ApplicationContext는 여러 가지 구현체가 있으며, 각각의 구현체는 특정 용도에 맞춰 사용됩니다. 대표적인 구현체는 다음과 같습니다:

  1. AnnotationConfigApplicationContext: 주로 Java 기반 설정에서 사용됩니다. 애노테이션 기반의 설정 클래스를 사용하여 빈을 등록하고 관리합니다.
  2. ClassPathXmlApplicationContext: XML 설정 파일을 사용하는 전통적인 방식입니다. 애플리케이션의 설정 정보를 XML 파일에서 읽어들여 빈을 관리합니다.
  3. GenericWebApplicationContext: 웹 애플리케이션에서 사용되는 ApplicationContext입니다. 서블릿 환경에서 빈을 관리하고, 웹 환경에 맞게 동작합니다.

ApplicationContext를 사용한 빈 등록 및 조회

1) Java 기반 설정 예시 (@Configuration 사용)

@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {
    // 빈 정의가 없는 경우, @ComponentScan을 사용하여 패키지 내의 빈을 자동으로 등록
}

public class Main {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        
        // "myBean" 이름의 빈을 가져오기
        MyBean myBean = context.getBean(MyBean.class);
        myBean.doSomething();
    }
}

2) XML 기반 설정 예시

beans.xml

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="myBean" class="com.example.MyBean"/>

</beans>

Main.java

public class Main {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        
        // "myBean" 이름의 빈을 가져오기
        MyBean myBean = context.getBean("myBean", MyBean.class);
        myBean.doSomething();
    }
}

위의 예시에서는 ApplicationContext를 사용하여 빈을 조회하고, 이를 통해 의존성을 주입받은 객체를 사용합니다. AnnotationConfigApplicationContext나 ClassPathXmlApplicationContext를 통해 ApplicationContext를 초기화하고, 필요한 빈을 getBean 메서드를 사용하여 조회합니다.


3. ApplicationContext의 다양한 기능

1) 빈의 자동 등록 (@Component, @Service, @Repository 등)

Spring은 애노테이션을 사용하여 자동으로 빈을 등록할 수 있습니다. @ComponentScan을 사용하면 지정된 패키지에서 @Component, @Service, @Repository, @Controller 등의 애노테이션이 붙은 클래스를 자동으로 빈으로 등록합니다.

@Service
public class MyService {
    // 서비스 로직
}

@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {
    // MyService는 자동으로 빈으로 등록됨
}

2) 빈의 의존성 주입 (Dependency Injection)

Spring에서는 ApplicationContext를 통해 객체 간의 의존성을 주입할 수 있습니다. @Autowired를 사용하여 자동으로 의존성을 주입하거나, 생성자 주입 방식을 사용할 수 있습니다.

@Component
public class MyService {
    private final MyRepository myRepository;

    @Autowired
    public MyService(MyRepository myRepository) {
        this.myRepository = myRepository;
    }
}

3) 이벤트 처리

Spring은 ApplicationContext를 통해 애플리케이션 이벤트를 처리할 수 있습니다. ApplicationEventPublisher를 사용하여 이벤트를 발행하고, @EventListener를 사용하여 이벤트를 수신할 수 있습니다.

@Component
public class MyListener {
    @EventListener
    public void handleContextStarted(ContextStartedEvent event) {
        // 애플리케이션 시작 이벤트 처리
    }
}

4. 결론

ApplicationContext는 Spring의 IoC 컨테이너로서, 애플리케이션의 빈을 관리하고 의존성을 주입하며, 애플리케이션의 생애 주기를 관리하는 중요한 역할을 합니다. ApplicationContext를 사용하면 빈을 효율적으로 관리할 수 있고, 애플리케이션의 복잡도를 줄이며 유지보수를 용이하게 할 수 있습니다.

Spring에서 ApplicationContext는 애플리케이션의 모든 구성 요소가 결합되고 관리되는 중심 역할을 하므로, 이를 이해하는 것이 Spring Framework를 잘 활용하는 데 중요합니다.

728x90