본문 바로가기

컴퓨터공학/Spring framework 분석

개념> Listener와 Root context의 설정법

1. ContextLoaderListener
1) Listener와 Root WebApplicationContext
2) config 설정법 종류


프롤로그

 

ApplicationContext 종류 요약
StaticApplicationContext : 

빈 설정 메타정보를 담은 BeanDefinition 오브젝트를 이해하기 위해 존재. 컨테이너에서 빈 등록 방식을 확인하는 목적
GenericApplicationContext : 

Xml을 리더기로 읽어서 BeanDefinition으로 변환해 사용, JUnit 테스트에서 사용
GenericXmlApplicationContext : 

GenericApplicationContext에 XmlBeanDefinitionReader 내장한 Application Context
WebApplicationContext : 

웹 환경에서 사용하기 위한 ApplicationContext


DispatcherServlet은 요청이 들어올 때마다 미리 생성한 WebApplicationContext에서 필요한 Bean을 불러오고 미리 지정한 메소드(Handler)를 호출한다.
스프링은 두 개의 WebApplicationContext를 구성한다. 

ContextLoaderListener 에 의해 만들어지는 Root WebApplication Context
DispatcherServlet에 의해 만들어지는 WebApplicationContext 
이 두 개는 Servlet Container에 있다. 

 


Root Application Context

What is the difference between ApplicationContext and WebApplicationContext in Spring MVC? - Stack Overflow

 

Root Application Context 등록은 Servlet의 이벤트 리스너 방식으로 이루어진다. 


이벤트 리스너는 무엇인가?
이벤트가 발생했을 때 그 처리를 담당하는 함수를 의미한다. 이벤트 핸들러라고 한다. 
지정된 타입의 이벤트가 특정요소에서 발생하면 그 요소에 등록된 이벤트 리스너를 실행한다. 
스프링은 웹 애플리케이션 시작, 종료 이벤트에 대한 리스너로 ServletContextListener 인터페이스를 사용한다. 

리스너가 서블릿 컨테이너의 시작과 종료를 주시한다.

즉, 이벤트 리스너 방식으로 Servlet Container(Tomcat)이 시작되거나 종료될 때

ServletContextListener 인터페이스의 contextInitialized(), contextDestroyed() 를 호출한다. 

서블릿 컨테이너가 시작하면 contextInitialized( ) 실행하여 Root Aplication Context 생성 및 초기화.
서블릿 컨테이너가 종료하면 contextDestroyed( ) 실행하여 Root Aplication Context 종료. 

 

 


스프링은 인터페이스인 ServletContextListener 구현체인 ContextLoaderListener가 있다.
리스너는 web.xml을 이용하여 설정한다. 
Listener는 시작부터 종료까지 있는 특성이 있다. 그래서 웹 애플리케이션  전체에 적용 가능한

DB연결 기능 또는 로깅같은 기능을 제공하는데 유용하다.

ContextLoaderListener 구현체가 웹 애플리케이션이 시작/종료할 때 

Root Application Context를 생성하고 종료하는데 사용되는 리스너 구현체이다.
Log4jConfigListener 구현체는 DB연결 기능이나 로깅을 위한 리스너 구현체이다. 

 

web.xml과 root-context.xml을 이용하는 구현법

일반적으로 WEB-INF 디렉토리 안에 있는 applicationContext.xml 을 디폴트 설정파일을  사용하는데 
web.xml에서 ContextLoaderListener 가 사용할 설정파일 위치를 파라미터 정보 
<context-param> 태그로 전달하여 변경할 수 있다.

 


 

두 번째 방법. 자바 클래스 파일과 어노테이션을 이용법

WebApplicationInitializer를 이용하는 방법인데 web.xml 없이 servlet context를 초기화할 수 있는 방법이다.

순수 자바클래스와 어노테이션을 이용한 방법이다. 


1. javax.servlet.ServletContainerInitializer 인터페이스를 구현한 클래스를 만든다. 
2. 그리고 클래스 이름을 /META-INF/services/javax.servlet.ServletContainerInitializer라는 텍스트 파일에 적는다. 
3. ServletContainerInitializer 구현 클래스 머리에 @HandleTypes 어노테이션으로 WebApplicationInitializer.class 를 지정한다.
4. WebApplicationInitializer 인터페이스를 구현한다. 
5. WAS가 시작하면 이 클래스가 실행한다. 

 


<< AnnotationConfigApplicationContext  이해 >> 

AnnotationConfigApplicationContext 는 @Configuration 어노테이션을 붙은 클래스를 설정 정보로 사용하는 클래스.  
변수 인터페이스는 ApplicationContext 라 두고 AnnotationConfigApplicationContext 객체를 생성하고 초기화하는데 특정 클래스를 매개변수에 입력.
이 클래스는 @Configuration 이 붙은 클래스여야 한다. 
즉, ApplicationContext context= new AnnotationConfigApplicationContext([클래스이름].class)
이런 식~  그리고 context에서 빈을 사용하고 싶을 때 context.getBean 이렇게 사용하면 된다. 

 

 

 



세 번째 방법. web.xml에 Root Application Context 구현체 주입법 

xml에 contextConfiguration 과 contextClass를 이용하는 방법인데 설정 자체는 자바 파일을 사용한다. 
구현체로 설정 방법은 AnnotationConfigWebApplicationContext 클래스를 이용. 
param-value 에 org.springframeork.context.annotaiton.AnnotationConfigApplicationContext 라고 입력
Root Application Context는 WebApplicationContext 인터페이스 구현체이다. 

 

 

 

순수 자바파일 이용할 때는 AnnotationConfigWebApplicationContext 초기화 시 주입했지만
xml에 자바파일 이용할 때는 초기화하지 않아도 된다. 

 


네 번째 방법. WebApplicationInitializer로 시작, 실제 설정은 xml파일. 


어노테이션 작성만 유의. 

 

 

https://offbyone.tistory.com/215

 

스프링프레임웍의 시동

스프링프레임웍이 제 기능을 수행하기 위해서는 필요한 설정, 빈들이 WAS 가 시작될 때 모두 생성되고, 준비가 되어야 합니다. 이렇게 준비하는 과정을 스프링프레임웍의 시동이라고 할 수 있겠

offbyone.tistory.com

What is the difference between ApplicationContext and WebApplicationContext in Spring MVC? - Stack Overflow

 

What is the difference between ApplicationContext and WebApplicationContext in Spring MVC?

What is the difference between Application Context and Web Application Context? I am aware that WebApplicationContext is used for Spring MVC architecture oriented applications? I want to know wha...

stackoverflow.com