
ContextLoaderListener는 스프링의 Root ApplicationContext의 생성과 소멸을 담당하는 부트스트랩 리스너이다.
부트스트랩 리스너
애플리케이션이 시작되거나 특정 이벤트가 발생할 때 자동으로 호출되는 이벤트 리스너로, 어플리케이션 초기화 과정에 필요한 설정과 준비 작업에 사용된다.
스프링을 사용하여 개발한 웹 프로젝트가 최초로 구성될 때 가장 먼저 서블릿 컨테이너의 구현체인Tomcat 웹 서버가 시작되면서 Web.xml 파일을 읽는다. 그리고 Web.xml에 정의되어 있는ContextLoaderListner가 실행되어 Root ApplicationContext를 생성하고 웹을 실행하는데 필요한 빈들을 적재한다.
Root ApplicationContext는 최상단의 ApplicationContext로서 서블릿 컨텍스트를 래핑해 사용한다. 데이터 소스 , 트랜잭션, 영속성, 서비스 레이어, 보안 등 어플리케이션 전반의 설정을 관리한다. 또한 국제화, 이벤트 전파, AOP 등 고급 기능을 지원한다. Root ApplicationContext에서 초기화되는 설정들은 어플리케이션 전반에서 사용되는 공통 설정을 포함하며 모든 서블릿이 공통적으로 사용할 수 있는 빈을 등록하기 때문에, WebApplicationContext의 생성 시점 보다 이전에 생성된다.

WebApplicationContext는 위의 그림과 같이 ApplicationContext을 확장해 웹 관련 기능을 추가로 제공하는 인터페이스이다. 구현체는 AnnotationConfigWebApplicationContext 등이 있다.
이전 포스트에서 IoC 컨테이너에 대해 알아보면서 스프링은 이를 ApplicationContext로 구현한다는 것을 알게되었다. IoC 컨테이너의 역할은 충분히 알아보았으니 WebApplicationContext가 결국 IoC 컨테이너의 기능을 한다는 것만 짚고 넘어가도록 하겠다. 그런데 IoC 컨테이너가 빈을 자동으로 만들어주면 프로그램도 자동으로 실행되는 것일까? 우리는 스프링을 사용했을 때 웹 어플리케이션이 어떻게 동작하는지 알아야할 필요가 있다.
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
빈 객체를 로드해 사용하기 위해서는 main문에서 IoC 컨테이너에 직접 요청할 수 있다. 하지만 웹 어플리케이션에서는 main 메서드를 실행시킬 수 있는 방법이 없기 때문에 다른 방법을 생각해 봐야한다.
웹 어플리케이션은 main()메서드에서 직접 빈 설정 파일을 로드하는 대신, 서블릿 컨테이너가 브라우저에서 오는 HTTP 요청을 받아 해당 요청에 매핑된 서블릿을 자동으로 실행시켜주는 방식으로 동작한다. 서블릿 컨테이너는 웹 어플리케이션 서블릿의 생명 주기를 관리해주고, 서블릿은 요청을 실행시켜주는 일종의 main 메서드 역할을 한다.
웹 어플리케이션이 시작될 때 미리 만든 WebApplicationContext에게 어플리케이션의 기동 역할을 해줄 빈 객체를 요청해 받아두고 미리 지정된 메서드를 호출함으로서 IoC 컨테이너가 DI로 구성한 어플리케이션의 기능들이 동작하는 것이다. 이처럼 main() 메서드에서 실행 했던 작업을 서블릿 컨테이너와 서블릿이 대신 해주는 것이다.
가만히 생각해보면 스프링 부트를 사용할 때는 이러한 설정을 한 적이 없다. 왜냐하면 웹 어플리케이션을 실행하면 스프링 부트가 알아서 ApplicationContext를 생성해 설정 메타정보로 초기화하고 요청이 들어오면 Dispatcher Servlet을 통해 기능을 실행해주었기 때문이다.
그리고 Dispatcher Servlet 또한 등록한 적이 없다. 스프링에서는 Web.xml파일에서 직접 등록할 수 있지만, 스프링 부트에서는 SpringAutoConfiguration에 의해 spring.factories안에 있는 Dispatcher Servlet을 자동으로 등록해주기 때문에 가능한 것이었다.