[Spring] 스프링 컨테이너(ApplicationContext)

Junseo Kim·2021년 6월 10일
4

Spring

목록 보기
1/7
post-thumbnail

ApplicationContext

ApplicationContext를 스프링 컨테이너라고 한다. ApplicationContextBeanFactory 인터페이스의 하위 인터페이스이다. 즉, ApplicationContextBeanFactory에 부가기능을 추가한 것이다.

BeanFactory는 스프링 컨테이너의 최상위 인터페이스이다. 스프링 빈을 관리하고 조회하는 역할을 한다. ApplicationContextBeanFactory + 부가 기능(국제화 기능, 환경 변수 관련 처리, 애플리케이션 이벤트, 리소스 조회)을 가진다.

정확히는 스프링 컨테이너를 부를 때, BeanFactory, ApplicationContext를 구분해서 말하지만, BeanFactory를 직접적으로 사용하는 경우는 거의 없다. 왜냐하면 ApplicationContextBeanFactory의 모든 기능을 가지고 있기 때문이다.

ApplicationContext의 구현체가 여러가지 있는데, 구현체에 따라 스프링 컨테이너를 XML을 기반으로 만들 수도 있고, 자바 클래스로 만들 수도 있다. 이게 가능한 이유는 빈 등록을 BeanDefinition으로 추상화해서 생성 하기 때문이다. XML로 하든, 자바로 하든 BeanDefinition이 생성된다.

스프링 컨테이너 내부에는 빈 저장소가 존재한다. 빈 저장소는 key로 빈 이름을 가지고 있으며, value로 실제 빈 객체를 가지고 있다.

스프링 컨테이너는 기본적으로 빈을 싱글톤으로 관리해준다. 따라서 싱글톤 컨테이너라고 불리기도 한다. 스프링 컨테이너가 빈을 싱글톤으로 관리해주면서 기존 싱글턴 패턴의 문제점(싱글톤 패턴 구현을 위한 코드가 추가되어야함, 구체 클래스에 의존, 유연성이 떨어짐 etc)은 없어지고, 싱글톤의 장점(매번 인스턴스를 생성할 필요없이 단 하나만 생성해서 비용을 줄일 수 있다.)만 가져갈 수 있다.

자바 설정 클래스로 스프링 컨테이너 생성하기

아래는 어노테이션 기반의 자바 클래스로 스프링 컨테이너를 만든 예시이다.

@Configuration
public class AppConfig {

    @Bean
    public StationService stationService() {
        return new StationServiceImpl(stationRepository());
    }
    
    @Bean
    public StationRepository stationRepository() {
        return new MemoryStationRepository();
    }
    
    @Bean
    // ...

}

new AnnotationConfigApplicationContext()를 통해 자바 기반 스프링 컨테이너를 만들어 준다. 그럼 비어있는 빈 저장소가 생긴다. 이때 만들어 둔 자바 설정 클래스를 파라미터로 넘겨줘서 생성한다. 그럼 자바 설정 클래스 내부의 @Bean 어노테이션이 붙은 메서드들을 실행하면서 빈 저장소에 실제 빈을 등록한다.

ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);

사용할 땐, 빈 등록 메서드 이름을 통해 객체를 가져올 수 있다.

StationService stationService = applicationContext.getBean("stationService", StationService.class);

0개의 댓글